intermediate
Composition over inheritance
Комбинируйте small collaborators, когда behavior меняется независимо, вместо deep class hierarchy, которая связывает unrelated changes.
Композиция собирает поведение из мелких коллабораторов — `class Report { constructor(private exporter: Exporter, private formatter: Formatter) {}` — вместо цепочки override в глубокой иерархии. Поведение меняется независимо: замените `PdfExporter` без трогания форматирования.
Наследование делит реализацию, но связывает с родителем; композиция — has-a и явная сборка (часто через DI).
На интервью: рефакторинг перегруженного base class в composed strategies и что стало проще тестировать.
Типовые ошибки: god base class; хрупкий template method override; слишком много мелких объектов без facade.
Компромисс — больше wiring против гибких, тестируемых точек вариации.
Чеклист:
- has-a, когда поведение смешивается независимо.
- Inject коллабораторов вместо extend.
- Сфокусированные composed объекты (SRP).