Molte volte i miei oggetti aziendali tendono ad avere situazioni in cui le informazioni devono attraversare troppo spesso i confini degli oggetti. Quando facciamo OO, vogliamo che le informazioni siano in un oggetto e il più possibile tutto il codice che si occupa di tali informazioni dovrebbe essere in quell'oggetto. Tuttavia, le regole aziendali non seguono questo principio e ciò mi crea problemi.
Ad esempio, supponiamo di avere un Ordine che ha un numero di OrderItems che si riferisce a un InventoryItem che ha un prezzo. Invoco Order.GetTotal () che somma il risultato di OrderItem.GetPrice () che moltiplica una quantità per InventoryItem.GetPrice (). Fin qui tutto bene.
Ma poi scopriamo che alcuni articoli sono venduti con un affare due per uno. Possiamo gestirlo facendo OrderItem.GetPrice () fare qualcosa come InventoryItem.GetPrice (quantità) e lasciando che InventoryItem gestisca questo.
Tuttavia, scopriamo che l'affare due per uno dura solo per un determinato periodo di tempo. Questo periodo di tempo deve essere basato sulla data dell'ordine. Ora cambiamo OrderItem.GetPrice () in InventoryItem.GetPrice (quatity, order.GetDate ())
Ma allora abbiamo bisogno di supportare prezzi diversi a seconda di quanto tempo il cliente è rimasto nel sistema: InventoryItem.GetPrice (quantità, order.GetDate (), order.GetCustomer ())
Ma poi si scopre che le offerte due-a-uno si applicano non solo all'acquisto di più articoli dello stesso inventario, ma anche a multipli per qualsiasi articolo in una InventoryCategory. A questo punto alziamo le mani e diamo semplicemente all'InventoryItem l'articolo dell'ordine e gli consentiamo di spostarsi sul grafico di riferimento dell'oggetto tramite gli accessori per ottenere le informazioni di cui ha bisogno: InventoryItem.GetPrice (questo)
TL; DR Voglio avere un basso accoppiamento negli oggetti, ma le regole aziendali spesso mi costringono ad accedere alle informazioni da tutto il luogo per prendere decisioni particolari.
Ci sono buone tecniche per affrontarlo? Altri trovano lo stesso problema?