Thursday, July 29, 2010

Don’t talk to the strangers

Читая про принципы проектирования модулей, я наткнулся на еще один интересный принцип «Don’t talk to the strangers» (или “Only talk to your friends ” или «Law of Demeter», LOD).

Каждый юнит должен как можно меньше знать о других юнитах: только о непосредственно с ним связанных. Или: Юнит может общаться только со своими непосредственными друзьями и не может общаться с незнакомцами.

Основная цель этого принципа – минимизировать связность между юнитами. Применительно к ООП под юнитом понимают метод класса.

Следуя этому принципу, метод может вызывать:

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

Распространенным примером нарушения этого принципа является следующий код:

alpha = beta.GetAlpha()
gamma = alpha.GetGamma()

Если beta – параметр метода, то вызов его метода является допустимым. Но alpha – уже не параметр, и значит, используя его в нашем методе, мы добавляем себе лишнюю зависимость. Вариантом решения может быть добавление к типу beta метода GetGamma(). Это позволит убрать лишнюю зависимость.

gamma = beta.GetGamma()

Еще один классический пример использования LOD можно посмотреть здесь.

Применяя LOD, мы в итоге получим менее связанные классы. И это хорошо т.к. изменения в одних классах будут меньше или вообще не будут затрагивать другие классы. Это согласуется с принципом OCP. Однако во всем надо знать меру. Если для того чтобы не нарушать LOD вы начинаете раздувать интерфейсы своих классов обертками типа GetGamma() из примера, то тем самым вы наверняка нарушаете ISP. Задумайтесь насколько хорош ваш дизайн, если вам понадобилась куча оберток.

Ссылки:

No comments:

Post a Comment