ООП и принципы проектирования (SOLID)
Язык, на котором обсуждают проектные решения: четыре принципа ООП и виды полиморфизма, пять принципов SOLID (SRP, OCP, LSP, ISP, DIP) на конкретных примерах, а также KISS, DRY и YAGNI и грань, за которой принципы начинают вредить. Цель — не заучить определения, а понимать, какую проблему решает каждый принцип и какой ценой. Примеры на C#, но сами принципы языко-нейтральны.
Что внутри курса
01
ООП и SOLID
8 уроковПринципы, на которых стоит объектно-ориентированное проектирование: четыре столпа ООП и виды полиморфизма, пять принципов SOLID на примерах и набор KISS/DRY/YAGNI. Каждый принцип разбирается как решение конкретной проблемы поддерживаемости — и как компромисс, у которого есть цена и граница применимости.
- Четыре столпа ООП: инкапсуляция, наследование, полиморфизм, абстракцияЧетыре столпа ООП — не термины для зубрёжки, а инструменты управления сложностью: инкапсуляция прячет состояние за контрактом и держит инварианты, абстракция отделяет «что» от «как», наследование переиспользует ценой сильной связи, полиморфизм делает реализации взаимозаменяемыми. Центр — инкапсуляция и абстракция, не наследование.
- Виды полиморфизма и замена switch-по-типуПолиморфизм бывает трёх видов — подтипный (virtual/override, выбор по runtime-типу), ad-hoc (перегрузка) и параметрический (generics). Урок разбирает их различие и ключевое применение подтипного: замену разрастающегося switch-по-типу виртуальным методом, где добавление типа становится новым классом, а не правкой всех ветвлений.
- SRP: единственная ответственностьSRP — у класса одна ответственность и одна причина для изменения, где «причина» — это ось изменения или заинтересованная сторона, а не строка кода. Урок показывает, как класс, который считает, форматирует и сохраняет, разделяют по сторонам, и почему SRP — про когезию, а не про размер класса.
- OCP: открыт для расширения, закрыт для измененияOCP — модуль открыт для расширения, но закрыт для изменения: новое поведение добавляют, не правя существующий код. Урок показывает, как контракт и полиморфизм превращают добавление варианта в новый класс вместо правки switch, почему «закрыт» не значит «заморожен» и где граница, за которой абстракция вводится впрок и вредит.
- LSP: подстановка ЛисковLSP — объект подтипа должен подставляться вместо базового без нарушения корректности, и проверяет это не компилятор, а поведенческий контракт. Урок разбирает классический Square/Rectangle, где «is-a» по словарю ломает клиента, и показывает, что нарушение LSP — признак неверной иерархии наследования.
- ISP: разделение интерфейсовISP — клиента нельзя заставлять зависеть от методов, которыми он не пользуется: толстый интерфейс навязывает реализациям заглушки (заодно нарушая LSP) и связывает несвязанных клиентов. Урок дробит fat interface на узкие ролевые контракты и показывает, что ISP — это SRP на уровне интерфейсов и подготовка к DIP.
- DIP: инверсия зависимостейDIP — высокоуровневые модули и детали зависят от абстракций, а не друг от друга: высокий уровень объявляет интерфейс, деталь его реализует, и направление зависимости инвертируется. Урок показывает, почему new внутри класса приклеивает его к детали, как подстановка реализации снаружи лечит это и чем DIP отличается от DI.
- KISS, DRY, YAGNI и грань over-engineeringKISS, DRY и YAGNI уравновешивают догматичный SOLID: простейшее работающее решение, один источник истины (но дублирование лучше неверной абстракции) и отказ строить под воображаемое будущее. Урок закрывает модуль мыслью, что все принципы служат поддерживаемости, а применённые впрок дают over-engineering.
Готовьтесь по структуре, а не вслепую
Откройте курс в приложении и закрепляйте темы в тренажёре вопросов с AI-разбором.