Muitas vezes, meus objetos de negócios tendem a ter situações em que as informações precisam cruzar os limites de objetos com muita frequência. Ao fazer OO, queremos que as informações estejam em um objeto e, tanto quanto possível, todo código que lida com essas informações esteja nesse objeto. No entanto, as regras de negócios não seguem esse princípio, causando problemas.
Como exemplo, suponha que tenhamos um Pedido que tenha vários OrderItems que se refiram a um InventoryItem que tenha um preço. Invoco Order.GetTotal () que soma o resultado de OrderItem.GetPrice () que multiplica uma quantidade por InventoryItem.GetPrice (). Por enquanto, tudo bem.
Mas então descobrimos que alguns itens são vendidos com um acordo de dois por um. Podemos lidar com isso fazendo com que OrderItem.GetPrice () faça algo como InventoryItem.GetPrice (quantidade) e deixe InventoryItem lidar com isso.
No entanto, descobrimos que o acordo de dois por um dura apenas um período de tempo específico. Esse período precisa ser baseado na data do pedido. Agora, alteramos OrderItem.GetPrice () para InventoryItem.GetPrice (quatity, order.GetDate ())
Porém, precisamos oferecer suporte a preços diferentes, dependendo de quanto tempo o cliente está no sistema: InventoryItem.GetPrice (quantidade, pedido.GetDate (), pedido.GetCustomer ())
Porém, as transações de dois por um se aplicam não apenas à compra de vários itens do mesmo inventário, mas também a vários itens de uma categoria de inventário. Nesse ponto, levantamos as mãos e fornecemos o item de pedido ao InventoryItem e permitimos que ele percorra o gráfico de referência do objeto por meio de acessadores para obter as informações necessárias: InventoryItem.GetPrice (this)
TL; DR Quero ter um baixo acoplamento de objetos, mas as regras de negócios geralmente me forçam a acessar informações de todo o lugar para tomar decisões específicas.
Existem boas técnicas para lidar com isso? Outros acham o mesmo problema?