Закон Деметры
Закон Деметры (англ. Law of Demeter, LoD)[1] — набор правил проектирования при разработке программного обеспечения, в частности объектно-ориентированных программ, накладывающий ограничения на взаимодействия объектов (модулей). Обобщенно, закон Деметры является специальным случаем слабой связанности (англ. loose coupling).
Правило основывается на принципе наименьшего знания[1]. Основной идеей является то, что объект должен иметь как можно меньше представления о структуре и свойствах чего угодно (включая собственные подкомпоненты).
Говоря упрощённо, каждый программный модуль:
- должен обладать ограниченным знанием о других модулях: знать о модулях, которые имеют «непосредственное» отношение к этому модулю;
- должен взаимодействовать только с известными ему модулями-«друзьями», не взаимодействовать с «незнакомцами»;
- обращаться только к непосредственным «друзьям».
Аналогия из жизни: если Вы хотите, чтобы собака побежала, глупо командовать её лапами; лучше отдать команду собаке, а она уже разберётся со своими лапами сама.
Правила были предложены в конце 1987 в Северо-Восточном университете (Бостон, Массачусетс, США). Название взято из проекта «Деметра», который использовал идеи аспектно-ориентированного и адаптивного программирования. Проект был назван в честь Деметры, греческой богини земледелия, чтобы подчеркнуть достоинства философии программирования «снизу вверх».
В объектно-ориентированном программировании
[править | править код]Общее описание правила: Объект A не должен иметь возможность получить непосредственный доступ к объекту C, если у объекта A есть доступ к объекту B и у объекта B есть доступ к объекту C.
Более формально, закон Деметры для функций требует, чтобы метод объекта должен вызывать методы только следующих типов объектов[1]:
- собственно, самого ;
- параметров ;
- других объектов, созданных в рамках ;
- прямых компонентных объектов ;
- глобальных переменных, доступных , в пределах .
Практически, объект-клиент должен избегать вызовов методов объектов, внутренних членов, возвращенных методом объекта-сервиса.
Для многих современных объектно-ориентированных языков программирования, использующих точку как оператор доступа к членам класса, закон может быть перефразирован как «используйте только одну точку».
Использование процесса внедрения зависимостей способствует соблюдению закона Деметры[2].
Многоярусная архитектура может также рассматриваться как пример реализации закона Деметры в программной системе. В такой архитектуре код каждого яруса может вызвать только код своего или низшего яруса. Вызов через ярус является нарушением многоярусной архитектуры.
Пример кода
[править | править код]Таким образом, код a.b.Method()
нарушает закон Деметры, а код a.Method()
является корректным.
Преимущества и недостатки
[править | править код]Преимущества
[править | править код]Преимуществами закона Деметры является то, что код, разработанный с соблюдением данного закона, делает написание тестов более простым[3], а разработанное программное обеспечение имеет большие возможности повторного использования кода, из-за чего его легче поддерживать. Так как объекты являются менее зависимыми от внутренней структуры других объектов, контейнеры объектов могут быть изменены без модификации вызывающих объектов (клиентов).
Недостатки
[править | править код]Недостатком закона Деметры является то, что иногда требуется создание большого количества малых методов-адаптеров (делегатов) для передачи вызовов метода к внутренним компонентам.
Примечания
[править | править код]- ↑ 1 2 3 Vernon, 2013.
- ↑ Внедрение зависимостей для соблюдения Закона Деметры Архивная копия от 14 апреля 2016 на Wayback Machine (запись вебинара)
- ↑ Упрощение разработки тестов для кода, соблюдающего закон Деметры Архивная копия от 14 апреля 2016 на Wayback Machine (запись вебинара Google Talks с 16 минуты)
Литература
[править | править код]- Стив Макконнелл. Совершенный код = Code Complete. — Русская Редакция, Питер, 2005. — С. 31. — 896 с.
- Vaughn Vernon. Implementing Domain-Driven Design. — Addison-Wesley Professional, 2013. — ISBN 9780133039900.
Ссылки
[править | править код]- b:Несвязность и закон Деметры. Викиучебник
- Demeter: Aspect-Oriented Software Development первоисточник (англ.)
- Закон Деметры или как избежать спагетти-ассоциаций
- Связность и увязка. Закон Деметры на сайте msdn.microsoft.com
- Описание на сайте life-prog.ru