Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Як реалізувати OCP через композицію?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**OCP через композицію** реалізується так, що клас не перевизначають через успадкування, а передають усередину нього об'єкт, який визначає поведінку. **Ключове:** OCP через композицію реалізується за допомогою стратегій, делегування та ін'єкції залежностей - базовий код лишається незмінним, а нова поведінка додається створенням нових компонентів, переданих у клас ззовні.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняOCP через композицію реалізується так, що **клас не перевизначають через успадкування, а передають усередину нього об'єкт, який визначає поведінку**. Нова поведінка додається створенням нових стратегій/компонентів, а не зміною наявного коду. Детальніше: ## 1. Клас отримує залежність через інтерфейс або абстракцію Замість того щоб перевизначати методи в нащадках, клас приймає об'єкт, який реалізує визначений контракт. Цей об'єкт визначає змінювану поведінку. ## 2. Код закритий для модифікації Клас, що використовує залежність, не змінюється. Він просто викликає методи переданої стратегії. ## 3. Нова поведінка додається створенням нового компонента Щоб реалізувати новий варіант поведінки, створюється новий клас, що реалізує той самий інтерфейс. Наявні класи лишаються незмінними - це і є дотримання OCP. Приклад (стратегія оплати): Інтерфейс поведінки: ```python class PaymentStrategy: def pay(self, amount): raise NotImplementedError ``` Реалізації: ```python class CardPayment(PaymentStrategy): def pay(self, amount): print("Оплата карткою:", amount) class PayPalPayment(PaymentStrategy): def pay(self, amount): print("Оплата через PayPal:", amount) ``` Клас, що використовує стратегію: ```python class CheckoutService: def __init__(self, payment_strategy: PaymentStrategy): self.payment_strategy = payment_strategy def process(self, amount): self.payment_strategy.pay(amount) ``` Розширення: ```python class CryptoPayment(PaymentStrategy): def pay(self, amount): print("Оплата криптовалютою:", amount) ``` ## Чому це OCP 1. **CheckoutService ніколи не змінюється.** Він повністю закритий для модифікації. 2. **Нова поведінка додається новими стратегіями.** CryptoPayment - новий клас, який не вимагає зміни наявної системи. 3. **Клієнтський код просто підставляє новий компонент.** Наприклад: ```python checkout = CheckoutService(CryptoPayment()) checkout.process(100) ``` 4. **Композиція гнучкіша за успадкування.** Поведінку можна підмінювати в рантаймі, комбінувати або змінювати без створення нових ієрархій класів. Підсумок: **OCP через композицію реалізується за допомогою стратегій, делегування та ін'єкції залежностей: базовий код лишається незмінним, а нова поведінка додається створенням нових компонентів, переданих у клас ззовні.**Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.