Найти в Дзене

Композиция как альтернатива наследованию

Оглавление

Композиция — это важная концепция в архитектуре, при которой один объект включает в себя другие объекты для расширения своих возможностей. Очень часто композицию сравнивают с наследованием и говорят, что это как раз его альтернатива.

Подход с композицией часто используется для создания переиспользуемых и модульных компонентов. Например, можно сделать отдельные компоненты для загрузки изображений, обработки ошибок и отображения данных, и затем "собрать" нужные на одном экране.

Пример:

Представьте, что у каждого котика есть хвост, уши и мурлыкающий механизм. Вместо того чтобы "наследовать" эти части, котик их "компонует".

Когда котик рад, он мурлычет, двигает хвостом и прямит уши (да, я знаю, что коты не двигают хвостом, когда рады). Все эти действия собираются в одном классе Cat, но каждая часть реализована в своем собственном классе.

Плюсы

  1. Гибкость: композиция позволяет легко добавлять, удалять или изменять части системы без изменения других компонентов. Если мы захотим поменять хвост, то легко это сделаем, не трогая уши и мурлыкающий механизм.
  2. Тестирование: мы пишем отдельный маленький unit-тест на отдельный маленький компонент, а не сразу на всё, где куча вариантов.
  3. Принцип единственной ответственности: композиция упрощает соблюдение принципа единственной ответственности (SOLID), поскольку каждый компонент или объект имеет свою уникальную задачу. Хвост отвечает только за хвост, мурлыкающий механизм отвечает только за мурлыканье.
  4. Легкость в рефакторинге: изменения в одном компоненте в большинстве случаев не затрагивают другие части системы.

Минусы

  1. Сложность: в больших проектах количество компонентов может быстро увеличиваться, что может сделать архитектуру трудной. Иногда бывает так, что в котике становится слишком много компонентов и становится уже сложно это читать.
  2. Управление состоянием: компоненты, включенные в композицию, могут иметь свои собственные состояния, которые нужно согласовать. Это может усложнить управление состоянием в приложении.
  3. Зависимости: в зависимости от того, как вы проектируете свои компоненты, может возникнуть сильная связанность между ними, что затруднит их независимое использование и тестирование. Помним, что сильная связанность обычно нам вредит.

-2

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes

P.S. сделано с помощью ChatGPT и Midjourney. :)