2016-07-29 4 views
0

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

list.get(i).doSomething(); 

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

+0

Не могли бы вы объяснить, как вы видите нарушение закона Деметры? – Matthew

+0

Возможно, расскажите больше о том, что вы хотите сделать? Я не вижу здесь проблемы, это не похоже на то, что вы вызываете 10 геттеров подряд. – Tunaki

+0

Я понимаю, что это не огромное нарушение, но оно все еще похоже на запах кода. Это нарушение LoD, потому что я извлекаю объект из ArrayList и затем вызываю метод на извлеченном объекте. Технически я должен сделать что-то вроде list.callSomethingOn (i), чтобы сохранить Закон Деметры, но это также кажется неправильным – kabeersvohra

ответ

1

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

Если у вас есть класс

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.

1

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

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

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

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

Если этот конкретный экземпляр List занимает центральное место в логику вашей программы, и вы непреклонны об удовлетворении права, вы можете использовать «Декоратор» для List, который добавляет дополнительные методы для работы с содержали Object s