This lesson is not translated yet – the Russian original is below.
Модуль закончился – соберём девять принципов в одну картину. Каждый из них отвечает на свой вопрос и включается по своему сигналу.
| Принцип | Отвечает на вопрос | Сигнал, что пора применить |
|---|---|---|
| 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 не в открытии, а в том, что у здравого смысла появились имена, которые можно назвать на код-ревью.