Во многих случаях мои бизнес-объекты обычно бывают в ситуациях, когда информация слишком часто пересекает границы объекта. При выполнении ОО мы хотим, чтобы информация была в одном объекте, и как можно больше кода, работающего с этой информацией, должен быть в этом объекте. Однако бизнес-правила не следуют этому принципу, что доставляет мне неприятности.
В качестве примера предположим, что у нас есть Order, который имеет несколько OrderItems, который ссылается на InventoryItem, у которого есть цена. Я вызываю Order.GetTotal (), который суммирует результат OrderItem.GetPrice (), который умножает количество на InventoryItem.GetPrice (). Все идет нормально.
Но затем мы узнаем, что некоторые вещи продаются с двумя за одну сделку. Мы можем справиться с этим, если бы OrderItem.GetPrice () сделал что-то вроде InventoryItem.GetPrice (количество) и позволил InventoryItem справиться с этим.
Однако затем мы обнаруживаем, что сделка «два к одному» длится только в течение определенного периода времени. Этот период времени должен быть основан на дате заказа. Теперь мы изменим OrderItem.GetPrice () на InventoryItem.GetPrice (quatity, order.GetDate ())
Но тогда нам нужно поддерживать разные цены в зависимости от того, как долго клиент находился в системе: InventoryItem.GetPrice (amount, order.GetDate (), order.GetCustomer ())
Но затем выясняется, что сделки «два к одному» применяются не только к покупке нескольких товаров одного и того же предмета, но и нескольких для любого предмета в InventoryCategory. На этом этапе мы возбуждаем руки и просто даем InventoryItem элемент заказа и позволяем ему перемещаться по графу ссылок объекта через средства доступа, чтобы получить информацию, которая ему нужна: InventoryItem.GetPrice (this)
TL; DR Я хочу иметь низкую связь между объектами, но бизнес-правила часто вынуждают меня получать доступ к информации повсюду, чтобы принимать конкретные решения.
Есть ли хорошие методы для борьбы с этим? Другие находят ту же проблему?