Какой принцип SOLID самый сложный для реализации и почему
Что проверяют
Правильного ответа здесь нет, проверяют глубину: понимаете ли вы принципы дальше расшифровки аббревиатуры и можете ли обосновать мнение примером из C#. Следом просят показать нарушение выбранного принципа в коде и рассказать, как вы его исправляли.
Как отвечать
Выберите один принцип и защищайте выбор. Самые убедительные варианты:
- LSP (подстановка Лисков): сложен тем, что компилятор его не проверяет. Наследник компилируется и при этом нарушает контракт базового типа: усиливает предусловие, ослабляет постусловие, бросает исключение, которого вызывающий код не ждёт. Пример прямо из .NET: массив реализует
IList<T>, ноAddбросаетNotSupportedException, и код, написанный противIList<T>, получает сюрприз во время выполнения; - SRP (единственная ответственность): сложен размытостью, что считать одной ответственностью, каждый решает сам. Формулировка «одна причина для изменения» работает, если думать о том, чьи требования меняют класс: бухгалтерии, безопасности, отчётности;
- OCP (открытость и закрытость): требует угадать, где система будет меняться. Абстракция не в том месте мешает сильнее, чем её отсутствие.
Для LSP назовите способы защиты: композиция вместо наследования, sealed на классах, от которых наследоваться не задумано, узкие интерфейсы по возможностям (IReadOnlyList<T> вместо IList<T>, если запись не нужна), общие контрактные тесты на всех наследниках.
Затем приведите свой пример: какую иерархию или сервис вы переделывали, что сломалось и как это обнаружили. Пример нужен настоящий. Если такого не было, честно разберите классический случай и скажите, где встречали похожее.
Где спотыкаются
Путают DIP с внедрением зависимостей. Контейнер Microsoft.Extensions.DependencyInjection это инструмент, а принцип говорит о направлении зависимостей: верхний уровень не зависит от деталей, обе стороны зависят от абстракции, которой владеет верхний уровень.
Объясняют LSP квадратом и прямоугольником, но не могут назвать нарушенный контракт: ширина и высота прямоугольника меняются независимо, а у квадрата нет.
Отвечают «все принципы одинаково сложны». Это уход от вопроса, интервьюер ждёт позицию и аргумент.