Что такое SOLID?

«Что такое SOLID?» — вопрос из категории Архитектура, который задают на 62% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SOLID — это акроним пяти ключевых принципов объектно-ориентированного проектирования, направленных на создание понятного, гибкого и поддерживаемого кода.

  1. S – Single Responsibility Principle (Принцип единственной ответственности). Класс должен иметь одну и только одну причину для изменения. Я применяю это, разделяя, например, класс Order, который знал всё о заказе, на Order (данные), OrderValidator (валидация) и OrderRepository (сохранение).

  2. O – Open/Closed Principle (Принцип открытости/закрытости). Сущности должны быть открыты для расширения, но закрыты для модификации. Вместо добавления условий if в метод CalculateDiscount(User user) для каждого нового типа пользователя, я создаю абстракцию IDiscountStrategy и набор классов (RegularDiscount, PremiumDiscount), которые легко добавляются.

  3. L – Liskov Substitution Principle (Принцип подстановки Барбары Лисков). Наследующий класс должен быть способен заменить родительский, не ломая логику программы. Если у меня есть Rectangle и Square, наследование Square от Rectangle нарушит LSP, так как изменение ширины у Square изменит и высоту. Лучше иметь общий интерфейс IShape.

  4. I – Interface Segregation Principle (Принцип разделения интерфейсов). Много специализированных интерфейсов лучше одного «толстого». Вместо IMonsterPrinter, который имел методы Print, Scan, Fax, я разделяю его на IPrinter, IScanner. Класс SimplePrinter тогда реализует только IPrinter.

  5. D – Dependency Inversion Principle (Принцип инверсии зависимостей). Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций. Вместо того чтобы класс ReportService напрямую создавал экземпляр MySqlRepository, он получает IRepository через конструктор. Это упрощает тестирование (можно подменить заглушкой) и смену реализации.

Следование этим принципам в моей работе снижает coupling (связность) и повышает cohesion (сцепление) кода.

Видео-ответы