Какие принципы проектирования кроме SOLID существуют
Что проверяют
Знаете ли вы принципы, которые работают на уровне отдельных решений в коде, и умеете ли применять их в PHP-проекте, а не только перечислять аббревиатуры. Следом обычно спрашивают, где эти принципы противоречат друг другу, например DRY и KISS.
Как отвечать
Назовите основные и к каждому дайте пример из PHP:
- DRY: у каждого знания одно место в системе. Правило валидации ИНН живёт в одном value object, а не копируется в контроллер, консольную команду и джобу;
- KISS: простое решение, пока задача не требует сложного. Массив конфигурации лучше самописного DSL;
- YAGNI: не писать абстракцию под гипотетический второй драйвер очереди, пока он не появился;
- Separation of Concerns: контроллер Laravel или Symfony принимает запрос и отдаёт ответ, логика живёт в сервисах, доступ к данным в репозиториях;
- закон Деметры: объект общается с ближайшими соседями. Цепочка
$order->customer->address->cityв шаблоне связывает его со всей моделью; - композиция вместо наследования: зависимость через конструктор вместо глубокой иерархии базовых контроллеров;
- Tell, Don't Ask: просите объект выполнить действие, а не вытаскивайте из него данные, чтобы решить за него;
- CQS: метод либо меняет состояние, либо возвращает данные;
- Fail Fast:
declare(strict_types=1), типизированные свойства,readonlyи исключение в конструкторе при невалидных данных; - GRASP: Information Expert, Low Coupling, High Cohesion и другие шаблоны распределения ответственности.
Покажите, что видите конфликты: агрессивный DRY плодит общие базовые классы и ломает KISS, а YAGNI иногда спорит с OCP.
Где спотыкаются
Понимают DRY как «нет двух одинаковых строк» и склеивают код, который похож случайно. Когда требования разойдутся, общий метод обрастёт флагами.
Считают трейты композицией. Трейт встраивает код в класс, связность он не снижает, а зависимость прячет.
Видят нарушение закона Деметры в любом fluent-интерфейсе. Query builder, который возвращает сам себя, закону не противоречит: вы общаетесь с одним и тем же объектом.