Закон Деметры очень сбивает с толку, потому что похоже, что я никогда не мог написать методы, которые возвращают объекты.

Такое ощущение, что я зашел в тупик. Если я правильно понял, то, следуя Закону Деметры, я никогда не смогу создать метод, возвращающий объект, а затем клиентский код вызывает его. Я просто думаю о фабричном шаблоне, который всегда возвращает объект. Да, есть классы картографов, которые возвращают объекты. А как же коллекции?


person PPPHP    schedule 19.02.2011    source источник


Ответы (1)


Вы неправильно поняли Закон Деметры и применяете его бесполезно:

Формально Закон Деметры для функций требует, чтобы метод M объекта O мог вызывать методы только следующих типов объектов:

  • о себе
  • параметры М
  • любые объекты, созданные/созданные в M
  • Объекты прямого компонента O
  • глобальная переменная, доступная O, в области M

В частности, фабрики используются для создания объекта, и тип создаваемого ими объекта является частью их общедоступного интерфейса. Таким образом, вызов методов объекта, созданного фабрикой, разрешен вышеизложенным.

person Thomas Edleson    schedule 19.02.2011
comment
Мне кажется, что нарушения LOD происходят в основном из-за того, что объекты выставляют ссылки на сущности, которыми получатель не будет владеть (вызывающий фабричный метод получает право собственности на сгенерированный объект). Вместо того, чтобы беспокоиться о том, можно ли законно использовать вложенные методы и свойства, я думаю, что более важный вопрос заключается в том, следует ли в первую очередь раскрывать ссылки на entities. - person supercat; 12.11.2013