Muchas veces mis objetos comerciales tienden a tener situaciones en las que la información necesita cruzar los límites de los objetos con demasiada frecuencia. Al hacer OO, queremos que la información esté en un objeto y, en la medida de lo posible, todo el código relacionado con esa información debe estar en ese objeto. Sin embargo, las reglas comerciales no siguen este principio, lo que me causa problemas.
Como ejemplo, suponga que tenemos un Pedido que tiene un número de Artículos de pedido que se refiere a un Artículo de inventario que tiene un precio. Invoco Order.GetTotal () que suma el resultado de OrderItem.GetPrice () que multiplica una cantidad por InventoryItem.GetPrice (). Hasta ahora tan bueno.
Pero luego descubrimos que algunos artículos se venden con un trato de dos por uno. Podemos manejar esto haciendo que OrderItem.GetPrice () haga algo como InventoryItem.GetPrice (cantidad) y dejando que InventoryItem se encargue de esto.
Sin embargo, luego descubrimos que el acuerdo de dos por uno solo dura un período de tiempo particular. Este período de tiempo debe basarse en la fecha del pedido. Ahora cambiamos OrderItem.GetPrice () para que sea InventoryItem.GetPrice (quatity, order.GetDate ())
Pero luego tenemos que admitir precios diferentes dependiendo de cuánto tiempo haya estado el cliente en el sistema: InventoryItem.GetPrice (cantidad, orden.GetDate (), orden.GetCustomer ())
Pero luego resulta que las ofertas de dos por uno se aplican no solo a la compra de múltiples del mismo artículo de inventario, sino a múltiples para cualquier artículo en una categoría de inventario. En este punto, levantamos nuestras manos y simplemente le damos al InventoryItem el artículo de pedido y le permitimos viajar sobre el gráfico de referencia del objeto a través de los accesores para obtener la información que necesita: InventoryItem.GetPrice (this)
TL; DR Quiero tener un bajo acoplamiento en los objetos, pero las reglas comerciales a menudo me obligan a acceder a información de todas partes para tomar decisiones particulares.
¿Existen buenas técnicas para lidiar con esto? ¿Otros encuentran el mismo problema?