Сохранение закона Деметры с 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
который добавляет дополнительные методы для работы с содержащимися Object
s