Композиция — это важная концепция в архитектуре, при которой один объект включает в себя другие объекты для расширения своих возможностей. Очень часто композицию сравнивают с наследованием и говорят, что это как раз его альтернатива.
Подход с композицией часто используется для создания переиспользуемых и модульных компонентов. Например, можно сделать отдельные компоненты для загрузки изображений, обработки ошибок и отображения данных, и затем "собрать" нужные на одном экране.
Пример:
Представьте, что у каждого котика есть хвост, уши и мурлыкающий механизм. Вместо того чтобы "наследовать" эти части, котик их "компонует".
Когда котик рад, он мурлычет, двигает хвостом и прямит уши (да, я знаю, что коты не двигают хвостом, когда рады). Все эти действия собираются в одном классе Cat, но каждая часть реализована в своем собственном классе.
Плюсы
- Гибкость: композиция позволяет легко добавлять, удалять или изменять части системы без изменения других компонентов. Если мы захотим поменять хвост, то легко это сделаем, не трогая уши и мурлыкающий механизм.
- Тестирование: мы пишем отдельный маленький unit-тест на отдельный маленький компонент, а не сразу на всё, где куча вариантов.
- Принцип единственной ответственности: композиция упрощает соблюдение принципа единственной ответственности (SOLID), поскольку каждый компонент или объект имеет свою уникальную задачу. Хвост отвечает только за хвост, мурлыкающий механизм отвечает только за мурлыканье.
- Легкость в рефакторинге: изменения в одном компоненте в большинстве случаев не затрагивают другие части системы.
Минусы
- Сложность: в больших проектах количество компонентов может быстро увеличиваться, что может сделать архитектуру трудной. Иногда бывает так, что в котике становится слишком много компонентов и становится уже сложно это читать.
- Управление состоянием: компоненты, включенные в композицию, могут иметь свои собственные состояния, которые нужно согласовать. Это может усложнить управление состоянием в приложении.
- Зависимости: в зависимости от того, как вы проектируете свои компоненты, может возникнуть сильная связанность между ними, что затруднит их независимое использование и тестирование. Помним, что сильная связанность обычно нам вредит.
Дубль статей в телеграмме — https://t.me/android_junior
Мои заметки в телеграмме — https://t.me/android_junior_notes
P.S. сделано с помощью ChatGPT и Midjourney. :)