Закон Деметры

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Закон Деметры (англ. Law of Demeter, LoD) — правило проектирования при разработке программного обеспечения, в частности объектно-ориентированных программ. Обобщенно, закон Деметры является специальным случаем слабой связанности (Loose coupling). Это правило было предложено в конце 1987 в северо-восточном Университете (Бостон, Массачусетс, США).

Говоря упрощённо, каждый программный модуль:

  • должен обладать ограниченным знанием о других модулях: знать о модулях, которые имеют «непосредственное» отношение к этому модулю.
  • должен взаимодействовать только с известными ему модулями «друзьями», не взаимодействовать с незнакомцами.
  • обращаться только к непосредственным «друзьям».

Аналогия из жизни: Если Вы хотите, чтобы собака побежала, глупо командовать ее ногами, лучше отдать команду собаке, а она уже разберётся со своими ногами сама.

Основной идеей является то, что объект должен иметь как можно меньше представления о структуре и свойствах чего угодно (включая собственные подкомпоненты).

Название взято из проекта «Деметра», который использовал идеи аспектно-ориентированного и адаптивного программирования. Проект был назван в честь Деметры, греческой богини земледелия, чтобы подчеркнуть достоинства философии программирования «снизу-вверх».

В объектно-ориентированном программировании[править | править вики-текст]

Общее описание правила: Объект A не должен иметь возможность получить непосредственный доступ к объекту C, если у объекта A есть доступ к объекту B и у объекта B есть доступ к объекту C.

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

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

Практически, объект-клиент должен избегать вызовов методов объектов, внутренних членов, возвращенных методом объекта-сервиса.
Для многих современных объектно-ориентированных языков программирования, использующих точку, как оператор доступа к членам класса, закон может быть перефразирован как «Используйте только одну точку».

Использование процесса внедрения зависимостей способствует[1] соблюдению Закона Деметры.

Многоярусная архитектура может также рассматриваться как пример реализации закона Деметры в программной системе. В такой архитектуре код каждого яруса может вызвать только код своего и низшего яруса. Вызов «через ярус» является нарушением многоярусной архитектуры.

Пример кода[править | править вики-текст]

Таким образом, код a.b.Method() нарушает Закон Деметры, а код a.Method() является корректным.

Преимущества и недостатки[править | править вики-текст]

Преимущества[править | править вики-текст]

Преимуществами закона Деметры является то, что код, разработанный с соблюдением данного закона, делает написание тестов более простым[2], а разработанное программное обеспечение менее сложно при поддержке и имеет большие возможности повторного использования кода. Так как объекты являются менее зависимыми от внутренней структуры других объектов, контейнеры объектов могут быть изменены без модификации вызывающих объектов (клиентов).

Недостатки[править | править вики-текст]

Недостатком закона Деметры является то, что иногда требуется создание большого количества малых методов-адаптеров (делегатов) для передачи вызовов метода к внутренним компонентам.

Примечания[править | править вики-текст]

Литература[править | править вики-текст]

  • Стив Макконнелл Совершенный код = Code Complete. — Русская Редакция, Питер, 2005. — С. 31. — 896 с.

Ссылки[править | править вики-текст]