Найти в Дзене
Код Мастерио

SOLID для Middle: когда пора перестать заучивать определения и начать чувствовать боль.

Твой код пахнет страхом Представь: понедельник, 10 утра, и бизнес просит "просто добавить новый тип скидки" в твой сервис заказов. Ты открываешь OrderService.php, и по спине бежит холодок - 2000 строк кода, где изменение в одном методе магическим образом ломает отправку email-уведомлений. Вы работаете на код, а не код на вас. И вот тут начинается самое интересное. SOLID - это не про академическую чистоту и не про то, как впечатлить коллег на код-ревью. Это про деньги. Для бизнеса это страховка от того, что через год стоимость внедрения фичи не превысит прибыль от неё. Для разработчика - это возможность уходить с работы в 18:00, зная, что проект не взорвется от одного чиха. Middle-разработчик отличается от Junior не знанием синтаксиса PHP 8.3 или 8.4 и т.д., а пониманием связности и зацепления. Смотрите сами: Но есть одна проблема. Если внедрять всё и сразу в MVP-проект, вы рискуете построить космолет там, где нужна была телега. Чуть позже я расскажу, какую именно букву из аббревиатуры
Оглавление

Твой код пахнет страхом

Представь: понедельник, 10 утра, и бизнес просит "просто добавить новый тип скидки" в твой сервис заказов. Ты открываешь OrderService.php, и по спине бежит холодок - 2000 строк кода, где изменение в одном методе магическим образом ломает отправку email-уведомлений. Вы работаете на код, а не код на вас.

И вот тут начинается самое интересное.

SOLID - это не про академическую чистоту и не про то, как впечатлить коллег на код-ревью. Это про деньги. Для бизнеса это страховка от того, что через год стоимость внедрения фичи не превысит прибыль от неё. Для разработчика - это возможность уходить с работы в 18:00, зная, что проект не взорвется от одного чиха.

Почему это нужно прямо сейчас?

Middle-разработчик отличается от Junior не знанием синтаксиса PHP 8.3 или 8.4 и т.д., а пониманием связности и зацепления.

Смотрите сами:

  • Бизнесу важна TTM (Time to Market). SOLID позволяет менять детали, не переписывая ядро.
  • Разработчику важна предсказуемость. SOLID делает код тестируемым по определению.

Но есть одна проблема. Если внедрять всё и сразу в MVP-проект, вы рискуете построить космолет там, где нужна была телега. Чуть позже я расскажу, какую именно букву из аббревиатуры стоит "выкинуть" первой, когда горят дедлайны.

Разбираем по косточкам кратко

S: Single Responsibility (Единственная ответственность)

Класс должен иметь только одну причину для изменения. Если ваш класс одновременно считает налоги и генерирует HTML - у вас проблемы.

// Bad: Класс делает всё
class ReportGenerator {
public function generate(array $data): string { /* logic */ }
public function formatHtml(string $content): string { /* logic */ }
}

// Good: Разделение ответственности
readonly class ReportDataProcessor {
public function process(array $raw): array { return $raw; }
}

readonly class HtmlFormatter {
public function format(array $data): string { return "<div>...</div>"; }
}

O: Open/Closed (Открытость/Закрытость)

Программные сущности открыты для расширения, но закрыты для модификации. Хотите добавить новый способ оплаты? Не трогайте существующий класс PaymentProcessor, добавьте новый драйвер.

L: Liskov Substitution (Подстановка Барбары Лисков)

Это просто: наследник не должен ломать логику родителя. Если Square наследует Rectangle, но меняет поведение высоты при установке ширины - вы нарушили принцип. В PHP 8.* используйте строгую типизацию возвращаемых значений, чтобы минимизировать риски.

I: Interface Segregation (Разделение интерфейсов)

Не заставляйте клиентов зависеть от методов, которые они не используют. Лучше 5 маленьких интерфейсов, чем один "бог-интерфейс".

D: Dependency Inversion (Инверсия зависимостей)

Зависьте от абстракций, а не от реализаций. В Laravel это решается через Service Container и Binding интерфейсов в провайдерах.

Когда можно "грешить"? ^_^

Давайте будем честными. SOLID увеличивает количество файлов и уровень абстракции.

Жертвуйте буквами, если:

  1. Вы проверяете гипотезу. Если код проживет 2 недели - забудьте про инверсию зависимостей.
  2. Проект микроскопический. Делать интерфейс для единственного API-клиента в скрипте на 50 строк - это оверинжиниринг.

Какую букву выкинуть первой? Часто это I (Interface Segregation) или D (Dependency Inversion). Если вы точно знаете, что база данных никогда не сменится с MySQL на MongoDB, иногда проще писать прямой вызов, чем плодить слои абстракции.

Но помните: за отказ от S (Single Responsibility) придется платить в стократном размере уже через месяц активной разработки.

Главный секрет выживания

Знаете, почему многие Middle-разработчики застревают на своем уровне? Они применяют SOLID как карго-культ, не понимая контекста.

Золотое правило: Применяйте SOLID там, где вы ожидаете частые изменения. Если логика стабильна годами - оставьте её в покое. Чистый код - это не тот, где соблюдены все принципы, а тот, который легко и дешево изменять под требования рынка.