Сохранение закона Деметры с ArrayLists

Если у меня есть ArrayList объектов, то в любой момент, когда мне нужно вызвать любой метод члена ArrayList, мне нужно сделать это следующим образом:

list.get(i).doSomething();

Это выглядит подозрительно как нарушение закона Деметры. Я не вижу никакого способа обойти это. Это хорошо, или я должен переосмыслить, как я делаю такие вещи. Является ли ArrayList объектом, определенным для игнорирования закона Деметры?

2 ответа

Решение

Это не нарушение.

Если у вас был класс

Class A {
    private B b1, b2, b3;

    ...

   private void method() {
       b1.doSomething();
       b2.doSomething();
       b3.doSomething();
   }
}

Нарушения нет. Если мы собираем экземпляр B в List<B> ты получаешь

Class A {
    private List<B> listOfB;

    ...

   private void method() {
       listOfB.forEach(B::doSomething);
   }
}

Используя List<B> держать экземпляры B не приводит к более жесткой связи между A а также B,

Я не вижу здесь нарушения.

Закон Деметры в своей концепции предполагает, что сущность знает только о своих соседях, а не незнакомцах, поэтому, если A нужно что-то от Cнадо поговорить с B чтобы получить это и не идти дальше.

Я бы точно не назвал List "сосед", чтобы применить к этой концепции. Это объект, который манипулирует структурой данных, которую вы можете использовать в своей программе. Следовательно Object что ваш список содержит будет считаться B на ваш A,

Если List была фактическая сущность, определенная в вашей программе, вы могли бы быть правы в этом случае. Было бы больше смысла иметь ваш List есть метод, который требует вашего Object выполнить некоторую логику (как вы сказали в комментарии, list.callSomethingOn(i)).

Если этот конкретный случай List занимает центральное место в логике вашей программы, и вы непреклонны в отношении соблюдения закона, вы можете использовать "Декоратор" для List который добавляет дополнительные методы для работы с содержащимися Objects

Другие вопросы по тегам