Программа курса← Объектно ориентированное программирование
1История ООП
2Объект и Класс
3Базовые концепции ООП
4Принцип проектирования GRASP
5Принцип проектирования SOLID
6Паттерны GOF
7Методические материалы

GRASP: выводы

Модуль закончился – соберём девять принципов в одну картину. Каждый из них отвечает на свой вопрос и включается по своему сигналу.

Принцип Отвечает на вопрос Сигнал, что пора применить
Information Expert кому поручить обязанность класс лезет за чужими данными, чтобы что-то посчитать
Creator кто создаёт объект new стоит там, где о создаваемом объекте ничего не знают
Controller кто принимает системные события сценарий живёт в обработчике кнопки или эндпоинте
Low Coupling как уменьшить зависимости правка в одном классе ломает три соседних
High Cohesion что оставить в классе назначение класса не описать без союза «и»
Polymorphism как обработать варианты по типу ветвление по типу, которое растёт с каждым релизом
Pure Fabrication куда деть неудобную обязанность доменный объект начинает знать про SQL и HTTP
Indirection как развязать двоих каждый модуль знает про каждый
Protected Variations как пережить изменение место, которое уже переписывали несколько раз

Попутно выяснилось несколько вещей, которых нет в формулировках.

Принципы спорят друг с другом – и это нормально. Information Expert требует отдать сохранение заказа самому заказу, Pure Fabrication – вынести его в репозиторий. GRASP не даёт единственно правильного ответа, он даёт список вопросов, которые стоит задать себе перед тем, как писать класс.

Связи не убирают, их перекладывают. Разрезали класс – связность половин упала, между ними появилось зацепление. Вопрос всегда один: где провести границу, чтобы связи остались внутри.

Любая косвенность платная. Посредник, интерфейс, лишний слой снижают зацепление, но добавляют прыжок при чтении. Косвенность, которая ничего не развязывает, – чистый убыток.

Названия не главное. Забыть, что OrderRepository – это Pure Fabrication, не страшно. Страшно перестать спрашивать себя, у кого данные и кто за что отвечает.

Что дальше

GRASP отвечал на вопрос «кому поручить обязанность». Следующий модуль – SOLID – проверяет получившуюся конструкцию на прочность: что случится, когда требования изменятся, и в каком месте она треснет.

Пять принципов, пять разных способов сломаться:

  • SRP – у класса одна причина меняться;
  • OCP – расширять, не переписывая;
  • LSP – наследник не подводит того, кто ждал предка;
  • ISP – узкие интерфейсы вместо одного широкого;
  • DIP – зависеть от абстракций, а не от реализаций.

Если после модуля осталось ощущение «это же просто здравый смысл» – так и есть. Ценность GRASP не в открытии, а в том, что у здравого смысла появились имена, которые можно назвать на код-ревью.