Такое ощущение, что я зашел в тупик. Если я правильно понял, то, следуя Закону Деметры, я никогда не смогу создать метод, возвращающий объект, а затем клиентский код вызывает его. Я просто думаю о фабричном шаблоне, который всегда возвращает объект. Да, есть классы картографов, которые возвращают объекты. А как же коллекции?
Закон Деметры очень сбивает с толку, потому что похоже, что я никогда не мог написать методы, которые возвращают объекты.
Ответы (1)
Вы неправильно поняли Закон Деметры и применяете его бесполезно:
Формально Закон Деметры для функций требует, чтобы метод M объекта O мог вызывать методы только следующих типов объектов:
- о себе
- параметры М
- любые объекты, созданные/созданные в M
- Объекты прямого компонента O
- глобальная переменная, доступная O, в области M
В частности, фабрики используются для создания объекта, и тип создаваемого ими объекта является частью их общедоступного интерфейса. Таким образом, вызов методов объекта, созданного фабрикой, разрешен вышеизложенным.
person
Thomas Edleson
schedule
19.02.2011
Мне кажется, что нарушения LOD происходят в основном из-за того, что объекты выставляют ссылки на сущности, которыми получатель не будет владеть (вызывающий фабричный метод получает право собственности на сгенерированный объект). Вместо того, чтобы беспокоиться о том, можно ли законно использовать вложенные методы и свойства, я думаю, что более важный вопрос заключается в том, следует ли в первую очередь раскрывать ссылки на entities.
- person supercat; 12.11.2013