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

SOLID: выводы

Пять принципов позади, и вместе с ними закончилась философская часть курса. Дальше – паттерны GOF: конкретные, с именами, схемами и готовым кодом. А до сих пор речь шла о вопросах, у которых нет универсального ответа.

Что на самом деле было

Все пять принципов – это пять способов задать один вопрос: что произойдёт, когда требования изменятся?

Принцип Вопрос, который он задаёт
SRP кто придёт с правкой в этот класс – и сколько их таких?
OCP вдоль какой оси пойдут изменения и можно ли добавить вариант, не трогая старое?
LSP выполнит ли наследник обещания, которые дал базовый тип?
ISP нужен ли клиенту весь интерфейс – или только пара методов?
DIP кому принадлежит контракт: логике или детали?

Ни один из них не проверяется линтером и не даёт однозначного ответа. Все пять требуют знать предметную область: что в ней меняется часто, а что не менялось ни разу.

Те же вопросы на другом масштабе

Почти всё, что поднимается на уровне кода, поднимается и на уровне систем. Замените «класс» на «сервис», и вопросы останутся теми же: границы микросервисов проводят по причинам изменения (SRP), новая версия API обязана выполнять обещания старой (LSP), а эндпоинт, отдающий всё «на всякий случай», делает заложниками всех потребителей (ISP).

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

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

Что забрать с собой

Названия принципов – ярлыки для разговора: сказать «здесь нарушен LSP» быстрее, чем объяснять проблему целиком. Но если выбирать между заученной формулировкой и привычкой задавать вопрос – выбирайте вопрос.

  • Кто придёт с правкой в этот код?
  • Что здесь изменится в следующие полгода – и что не менялось ни разу?
  • Выполняю ли я обещания, которые дал тем, кто мной пользуется?
  • Не заставляю ли я зависеть от того, что не нужно?

Эти четыре вопроса переживут и SOLID, и любой конкретный язык.

На собеседованиях. SOLID – самая спрашиваемая тема из всего, что мы разобрали: расшифровать пять букв просят почти всегда, а следом идёт «приведите пример нарушения», где заученная формулировка уже не спасает. Держите наготове по короткому примеру на каждую букву, лучше из своего кода.

Из девяти принципов GRASP в вопросах живут, по сути, два – Low Coupling и High Cohesion. Остальные семь всплывают редко, но на ревью пригодятся чаще, чем на собеседовании.

Дальше в курсе – паттерны GOF: готовые ответы на задачи, которые до вас решали тысячи раз.