Ответ
SOLID — это пять ключевых принципов объектно-ориентированного проектирования, направленных на создание понятного, гибкого и поддерживаемого кода.
Принципы:
-
Принцип единственной ответственности (Single Responsibility Principle, SRP): Класс должен иметь одну и только одну причину для изменения. Это означает, что он должен решать одну конкретную задачу.
- Проблема: Класс
Report, который и вычисляет данные, и сохраняет их в файл. - Решение: Разделить на
ReportCalculatorиReportSaver.
- Проблема: Класс
-
Принцип открытости/закрытости (Open/Closed Principle, OCP): Классы должны быть открыты для расширения (через наследование, композицию) и закрыты для модификации. Новый функционал добавляется новыми классами, а не изменением существующих.
- Пример: Вместо добавления
if-elseв методcalculateDiscount()для каждого типа клиента, создать абстрактный классDiscountStrategyи конкретные реализацииRegularDiscount,PremiumDiscount.
- Пример: Вместо добавления
-
Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP): Объекты базового класса должны быть заменяемы объектами его подклассов без нарушения корректности программы. Наследник не должен ужесточать предусловия или ослаблять постусловия родителя.
- Нарушение: Класс
Square, наследующий отRectangle. Если уRectangleесть сеттерыsetWidth()иsetHeight(), то дляSquareони нарушают инвариант (ширина всегда равна высоте).
- Нарушение: Класс
-
Принцип разделения интерфейса (Interface Segregation Principle, ISP): Много специализированных интерфейсов лучше одного общего. Клиент не должен зависеть от методов, которые он не использует.
- Пример: Вместо монолитного интерфейса
IMultifunctionPrinterс методамиprint(),scan(),fax(), создать отдельныеIPrinter,IScanner,IFaxMachine.
- Пример: Вместо монолитного интерфейса
-
Принцип инверсии зависимостей (Dependency Inversion Principle, DIP): Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей, детали должны зависеть от абстракций.
- Пример: Класс
OrderServiceдолжен зависеть от интерфейсаINotificationService, а не от конкретного классаEmailNotificationService. Это позволяет легко подменить реализацию наSmsNotificationService.
- Пример: Класс
Практическая польза: Следование SOLID облегчает рефакторинг, модульное тестирование и коллективную разработку, снижая связность кода и повышая его переиспользуемость.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶