SOLID на примерах из .NET
Вопрос
Расскажите про SOLID с примерами из вашего C#-кода.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
S: класс с одной причиной для изменения, например отдельные сервис и репозиторий
O: расширение без правки, стратегии через интерфейсы и регистрацию в DI
L: наследник подставим вместо базы, пример Square и Rectangle или NotImplementedException
I: узкие интерфейсы вместо одного толстого (IReadRepository и IWriteRepository)
D: зависимость от абстракций, внедрение через конструктор и контейнер ASP.NET Core
Принципы как ориентир, а не догма: без лишних абстракций ради абстракций
Что могут спросить следом
- Как DI-контейнер помогает соблюдать DIP?
- Приведите пример, где следование OCP усложнило код.
- Чем DIP отличается от DI?
Разбор
S, единственная ответственность: у класса одна причина меняться. Например, контроллер только принимает запрос, бизнес-логика в сервисе, доступ к данным в репозитории или DbContext.
O, открытость для расширения: новые способы оплаты я добавляю новой реализацией IPaymentProvider и регистрацией в DI, не трогая существующий код со switch.
L, подстановка Лисков: наследник не должен ломать ожидания. Классический пример: квадрат, унаследованный от прямоугольника. На практике нарушение выдаёт NotImplementedException в реализации интерфейса.
I, разделение интерфейсов: лучше IReader и IWriter, чем один интерфейс на двадцать методов, половину из которых клиент не использует.
D, инверсия зависимостей: бизнес-логика зависит от абстракций, а конкретные реализации подставляет контейнер ASP.NET Core через конструктор. При этом я не делаю интерфейс на каждый класс без причины: принципы помогают, пока снижают стоимость изменений.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «ООП в C#»
- Абстрактный класс или интерфейс
- protected internal и private protected
- Методы интерфейса по умолчанию
- Явная реализация интерфейса
- Банковские счета: инкапсуляция и инварианты
- Фигуры: полиморфная площадь
- Чем new отличается от override
- new и override при вызове через базовый тип