Molte volte i miei oggetti business tendono ad avere situazioni in cui le informazioni devono attraversare i confini degli oggetti troppo spesso. Quando facciamo OO, vogliamo che le informazioni siano in un oggetto e quanto più possibile tutto il codice che si occupa di quell'informazione dovrebbe essere in quell'oggetto. Tuttavia, le regole aziendali non seguono questo principio mi dà problemi.
Come esempio supponiamo di avere un Ordine che ha un numero di OrderItem che si riferisce a un InventoryItem che ha un prezzo. Invoco Order.GetTotal () che somma il risultato di OrderItem.GetPrice () che moltiplica una quantità di InventoryItem.GetPrice (). Fin qui tutto bene.
Ma poi scopriamo che alcuni articoli sono venduti con un affare due per uno. Possiamo gestirlo avendo OrderItem.GetPrice () fare qualcosa come InventoryItem.GetPrice (quantità) e lasciare che InventoryItem si occupi di questo.
Tuttavia, scopriamo che l'accordo due per uno dura solo un determinato periodo di tempo. Questo periodo di tempo deve essere basato sulla data dell'ordine. Ora cambiamo OrderItem.GetPrice () per essere InventoryItem.GetPrice (quatity, order.GetDate ())
Ma poi dobbiamo sostenere prezzi diversi a seconda di quanto tempo il cliente è stato nel sistema: InventoryItem.GetPrice (quantità, order.GetDate (), order.GetCustomer ())
Ma poi si scopre che le offerte "due per uno" non si applicano solo all'acquisto di più articoli dello stesso inventario ma più di un articolo in un InventoryCategory. A questo punto ci alziamo le mani e basta dare l'oggetto Inventory all'oggetto dell'ordine e permettergli di viaggiare sul grafico di riferimento dell'oggetto tramite gli accessor per ottenere le informazioni necessarie: InventoryItem.GetPrice (this)
TL; DR Voglio avere un basso accoppiamento negli oggetti, ma le regole aziendali spesso mi costringono ad accedere a informazioni da ogni parte per prendere decisioni particolari.
Ci sono buone tecniche per affrontare questo? Gli altri trovano lo stesso problema?