Какие преимущества и недостатки использования композиции в программировании?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Композиция — это предпочтительный способ строить объекты из небольших частей вместо жесткого наследования. Ожидают понимание, что она повышает гибкость и переиспользование кода. Также важно назвать её практические плюсы и ограничения в сравнении с наследованием.
Определение:
Композиция — это подход, при котором объект содержит другие объекты и делегирует им часть поведения. Вместо того чтобы расширять базовый класс, система собирается из независимых компонентов. Это помогает проектировать более слабосвязанный и легко изменяемый код.
Пример использования:
Например, у сервиса доставки может быть отдельный компонент для расчёта стоимости и отдельный — для отправки уведомлений. Если способ расчёта меняется, можно заменить только соответствующий компонент, не трогая остальной код.
class StandardDelivery:
def cost(self, distance):
return 100 + distance * 10
class ExpressDelivery:
def cost(self, distance):
return 200 + distance * 20
class Order:
def __init__(self, delivery_strategy):
self.delivery_strategy = delivery_strategy
def total_delivery_cost(self, distance):
return self.delivery_strategy.cost(distance)
order = Order(StandardDelivery())
print(order.total_delivery_cost(5)) # 150
order.delivery_strategy = ExpressDelivery()
print(order.total_delivery_cost(5)) # 300
Пояснение кода:
В этом примере класс Order не наследует способ доставки, а хранит его как зависимость. Метод total_delivery_cost просто делегирует расчёт объекту delivery_strategy. Это позволяет подменять поведение в рантайме без изменения Order.
Ключевые моменты:
- Композиция делает код более гибким, чем жёсткое наследование.
- Проще заменять отдельные части системы без влияния на весь класс.
- Уменьшается связанность между компонентами.
- Поведение можно комбинировать и подменять в рантайме.
- Недостаток — может потребоваться больше небольших классов и больше кода для сборки объектов.
- Для собеседования важно сказать: композицию часто предпочитают наследованию, когда нужно делегирование, а не “is-a” отношение.