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).