This lesson is not translated yet – the Russian original is below.
Пять принципов позади, и вместе с ними закончилась философская часть курса. Дальше – паттерны GOF: конкретные, с именами, схемами и готовым кодом. А до сих пор речь шла о вопросах, у которых нет универсального ответа.
Что на самом деле было
Все пять принципов – это пять способов задать один вопрос: что произойдёт, когда требования изменятся?
| Принцип | Вопрос, который он задаёт |
|---|---|
| SRP | кто придёт с правкой в этот класс – и сколько их таких? |
| OCP | вдоль какой оси пойдут изменения и можно ли добавить вариант, не трогая старое? |
| LSP | выполнит ли наследник обещания, которые дал базовый тип? |
| ISP | нужен ли клиенту весь интерфейс – или только пара методов? |
| DIP | кому принадлежит контракт: логике или детали? |
Ни один из них не проверяется линтером и не даёт однозначного ответа. Все пять требуют знать предметную область: что в ней меняется часто, а что не менялось ни разу.
Те же вопросы на другом масштабе
Почти всё, что поднимается на уровне кода, поднимается и на уровне систем. Замените «класс» на «сервис», и вопросы останутся теми же: границы микросервисов проводят по причинам изменения (SRP), новая версия API обязана выполнять обещания старой (LSP), а эндпоинт, отдающий всё «на всякий случай», делает заложниками всех потребителей (ISP).
Работают и оценки из GRASP: связность и зацепление на уровне сервисов считаются так же, как на уровне классов, – и с той же ошибкой. Разрезав систему по слоям, вы получите те же плохие границы, только связи между ними станут сетевыми вызовами: теперь их можно потерять, повторить или ждать секунду.
Из того, что принципы применимы к архитектуре, не следует, что делить нужно всегда. Разрезанный на сервисы монолит с плохими границами – это тот же клубок, но с сетью, распределёнными транзакциями и отладкой по трейсам.
Что забрать с собой
Названия принципов – ярлыки для разговора: сказать «здесь нарушен LSP» быстрее, чем объяснять проблему целиком. Но если выбирать между заученной формулировкой и привычкой задавать вопрос – выбирайте вопрос.
- Кто придёт с правкой в этот код?
- Что здесь изменится в следующие полгода – и что не менялось ни разу?
- Выполняю ли я обещания, которые дал тем, кто мной пользуется?
- Не заставляю ли я зависеть от того, что не нужно?
Эти четыре вопроса переживут и SOLID, и любой конкретный язык.
На собеседованиях. SOLID – самая спрашиваемая тема из всего, что мы разобрали: расшифровать пять букв просят почти всегда, а следом идёт «приведите пример нарушения», где заученная формулировка уже не спасает. Держите наготове по короткому примеру на каждую букву, лучше из своего кода.
Из девяти принципов GRASP в вопросах живут, по сути, два – Low Coupling и High Cohesion. Остальные семь всплывают редко, но на ревью пригодятся чаще, чем на собеседовании.
Дальше в курсе – паттерны GOF: готовые ответы на задачи, которые до вас решали тысячи раз.