Основні принципи композиції
Свайпніть щоб показати меню
Композиція зосереджена на створенні складних об'єктів шляхом об'єднання простіших, незалежних компонентів. Замість використання наслідування, яке створює жорсткі ієрархії, композиція дозволяє класам співпрацювати через вкладені об'єкти. Такий підхід робить системи більш гнучкими, модульними та простішими в обслуговуванні, оскільки компоненти можна замінювати або розширювати без порушення всієї структури.
123456789101112131415161718192021222324252627282930313233class Payment: def pay(self, amount): return f"Paid {amount}" class Inventory: def reserve(self, item): return f"{item} reserved" class Shipping: def ship(self, item): return f"{item} shipped" class Order: def __init__(self, item, price, payment, inventory, shipping): self.item = item self.price = price self.payment = payment self.inventory = inventory self.shipping = shipping def process(self): return " | ".join([ self.inventory.reserve(self.item), self.payment.pay(self.price), self.shipping.ship(self.item) ]) order = Order("Laptop", 1200, Payment(), Inventory(), Shipping()) print(order.process())
Order не реалізує логіку оплати, інвентаризації чи доставки самостійно.
Натомість він має окремі об'єкти (Payment, Inventory, Shipping) і використовує їх для виконання своєї роботи.
Кожен компонент відповідає лише за одну задачу, а Order лише координує їх.
Якщо потрібно змінити спосіб оплати чи доставки, можна замінити компонент без зміни класу Order.
Деякі підводні камені при використанні композиції: створення об'єктів-богів, які містять занадто багато компонентів і стають важкими для керування; витік API компонентів через зовнішній клас замість підтримки чистого інтерфейсу; і поява прихованого зв'язування, коли компоненти надто залежать від внутрішніх деталей один одного.
God object намагається виконувати занадто багато функцій. Він містить багато компонентів і відповідає за багато завдань, що ускладнює розуміння, тестування та підтримку класу.
Це трапляється, коли зовнішній клас відкриває внутрішні методи або атрибути своїх компонентів. Замість того, щоб надавати власний чистий інтерфейс, він змушує користувачів взаємодіяти безпосередньо з внутрішніми об'єктами.
Компоненти стають тісно пов'язаними через внутрішні деталі. Зміна однієї частини несподівано ламає іншу, оскільки вони залежать від внутрішньої структури один одного замість чітких контрактів.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат