Sobes.tech
Назад к вопросам
Junior — Middle
60

Какие преимущества и недостатки использования композиции в программировании?

Ответ от нейросети

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” отношение.