Общие принципы проектирования

  1. Инкапсулируйте то, что изменяется.
    Это основа всего ООП. Надо выделить компоненты, которые могут измениться, и отделить их от части системы, которая останется неизменной. Инкапсуляция позволит изменить или расширитьвыделенные компоненты без изменения остальной части системы. Основная проблема здесь в том, как лучше всего разделить приложение на части. Все паттерны проектирования занимаются ответом наэтот вопрос.
  2. Предпочитайте композицию наследованию.
    При композиции поведение не наследуется, а предоставляется для использования правильно выбранным объектом. Так же композиция позволяет изменить поведение объекта, если он подключен ненапрямую, а через интерфейс (см. след. принцип). Естественно, везде фанатично применять композицию и совсем отказаться от наследования было бы неразумно.
  3. Код должен зависеть от абстракций, а не от конкретных реализаций.
    Высокоуровневые компоненты не должны зависеть от низкоуровневых, и те и другие должны зависеть от абстракций. Авторы этой книги называют его принципоминверсии зависимостей (Inversion of Control, IoC). Лучше выделить контракт класса в интерфейс, а затем реализовать его.
  4. Стремитесь к слабой связности взаимодействующих объектов.
    Чем меньше объекты знают друг о друге, тем гибче система. Одному компоненту нет необходимости знать о внутреннем устройстве другого.
  5. Классы должны быть открыты для расширения, но закрыты для изменения.
    Это так называемый принцип «Открытости/закрытости». В разные периоды времени его реализовывали разным образом. Бертран Мейер предлагал в своей книге не изменять созданнуюреализацию класса, а при необходимости внесения изменений расширять класс посредством создания наследников. Позже была выдвинута идея использовать интерфейсы, реализации которых могут бытьполиморфно заменены одна на другую при необходимости.
  6. Взаимодействуйте только с близкими друзьями.
    Это принцип минимальной информированности. При проектировании класса надо обращать внимание на количество классов, с которыми будет происходить его взаимодействие. Чем меньшетаких классов, тем гибче система.
  7. Не вызывайте нас – мы сами вас вызовем.
    Или голливудский принцип. По Фаулеру – это синоним принципа IoC. Согласно идеи, компоненты высокого уровня (например, интерфейсы) определяют за компоненты низкого уровня(реализации), как и когда им подключаться к системе. Авторы Head First Design Patterns допускают, что согласно этому принципу компоненты низкого уровня могутучаствовать в вычислениях без формирования зависимостей с компонентами высокого уровня, и в этом состоит отличие от более жесткого IoC.
  8. Класс (или метод) должен иметь только одну причину для изменения.
    Это так называемый «принцип одной обязанности». Чем больше причин для изменения, тем больше вероятность изменения. А изменение – причина массы проблем. Принцип указывает на то,что классу (как и методу) должна быть выделена только одна обязанность. Например, в хорошо спроектированной системе с трехслойной архитектурой: один метод DAO делает ровно один запрос вбазу, один метод сервиса выполняет ровно одну задачу бизнес-логики, один метод контроллера вызывает сервис ровно один раз.

Теги: Общие принципы


Похожие статьи

KISS (keep it short and simple)

YAGNI (англ. You Ain't Gonna Need It — «Вам это не понадобится»)

S.O.L.I.D.

Don't Repeat Yourself (DRY, рус. Не повторяйся)