Багато разів у моїх бізнес-об’єктів трапляються ситуації, коли інформація повинна занадто часто перетинати межі об'єкта. Роблячи OO, ми хочемо, щоб інформація знаходилася в одному об’єкті і якомога більше весь код, що займається цією інформацією, повинен бути в цьому об'єкті. Однак правила ведення бізнесу не відповідають цьому принципу, доставляючи мені клопоту.
Як приклад, припустимо, що у нас є Порядок, який має ряд OrderItems, який посилається на InventoryItem, який має ціну. Я закликаю Order.GetTotal (), який підсумовує результат OrderItem.GetPrice (), який множить кількість на InventoryItem.GetPrice (). Все йде нормально.
Але потім ми з'ясовуємо, що деякі предмети продаються разом з двома за одну угоду. Ми можемо впоратися з цим, змусивши OrderItem.GetPrice () зробити щось на кшталт InventoryItem.GetPrice (кількість) і дозволити InventoryItem вирішувати це.
Однак тоді ми з'ясовуємо, що угода "два на один" триває лише певний часовий період. Цей часовий період повинен базуватися на даті замовлення. Тепер ми змінюємо OrderItem.GetPrice () на InventoryItem.GetPrice (quatity, order.GetDate ())
Але тоді нам потрібно підтримувати різні ціни залежно від того, як довго клієнт перебуває в системі: InventoryItem.GetPrice (кількість, замовлення.GetDate (), order.GetCustomer ())
Але потім виявляється, що угоди "два на один" застосовуються не лише до купівлі кількох одного і того ж предмета інвентарю, але до кількох для будь-якого предмета в InventoryCategory. У цей момент ми кидаємо руки і просто надаємо InventoryItem елемент замовлення і дозволяємо йому пересуватися по об'єктному довідковому графіку через аксесуари, щоб отримати необхідну інформацію: InventoryItem.GetPrice (це)
TL; DR Я хочу мати низький зв'язок в об'єктах, але правила ведення бізнесу часто змушують мене отримувати інформацію з усіх куточків місця для того, щоб приймати конкретні рішення.
Чи є хороші методи боротьби з цим? Чи виявляють інші цю ж проблему?