Sto rifattorizzando un'applicazione web di e-commerce, attualmente lavorando sulla classe UserBasket
, che dovrà gestire l'aggiunta o la rimozione di articoli, la modifica della loro quantità, l'ammontare totale, il numero totale di articoli ecc. Durante la visualizzazione sono necessari anche il cestino, il nome dell'elemento, la descrizione e il nome-immagine principale.
Il UserBasket
deve quindi conoscere il prezzo del Item
per la quantità specificata. I diversi metodi di calcolo del prezzo corrente applicabile dovrebbero essere scambiabili. Potrei utilizzare il modello Strategy
in una sorta di ItemPriceGetter
con cui verrà costruito UserBasket
, lasciando l'elemento inconsapevole di questo o costruendo il Item
stesso con un PriceFindingStrategy
.
Ho delle riserve contro un modello di dominio completamente anemico. Un articolo dovrebbe essere in grado di dirmi il suo prezzo per un determinato cliente e quantità in una certa data - dovrebbe essere in grado di dire il nome del file della sua immagine principale, la sua disponibilità ecc.
Essenzialmente, nel database, gli elementi (e altre entità di dominio) hanno più relazioni 1-to-n con logica a volte complessa e variabile per trovare quella attualmente applicabile tra loro (per prezzo, immagine, descrizione, ecc.).
Se non voglio un modello di dominio anemico, ma ci saranno diverse strategie per ottenere le informazioni "giuste", come posso evitare l'over-injection del costruttore quando ci sono più relazioni 1-to-n da un articolo in cui è necessaria una strategia per scegliere quella giusta.
Un Item
-Class è lì per informarti sui dati relativi agli articoli ed eseguire la logica di business che è centrata su di loro - così da renderti capace di dirti il prezzo per un determinato cliente e quantità, la sua immagine principale -filename o alcuni di essi non sembrano una violazione del Principio di Responsabilità Unica.
Con un modello di dominio anemico, avrei la logica divisa e incapsulata in modo preciso, ma ora, per esempio, una lista articoli per scoprire disponibilità, prezzo, nome e immagine di un oggetto, non avrebbe bisogno solo di un oggetto, ma anche un ItemPriceFinder
, ItemAvailabilityFinder
, ItemImageFinder
(o alcuni di questi) - la coesione (apparentemente) soffrirebbe e le cose che appartengono all'oggetto non sono più incapsulate lì.
Con un modello di dominio ricco, l'elemento stesso dovrà avere un ItemPriceStrategy
, ItemAvailabilityStrategy
, ItemImageStrategy
o simili. Quindi sembra che mi sia bloccato o iniettare molte dipendenze o perdere coerenza e rendere anemico il mio modello di dominio ... e in quest'ultimo caso, avrei ancora delle classi (che per esempio hanno bisogno di molte informazioni sugli Articoli) che ho dovrebbe costruire con l'oggetto dominio stesso e la maggior parte dei servizi per ottenere dati correlati.
Qual è la migliore pratica per affrontare una situazione del genere? Nello specifico: come dovrebbero essere incapsulati i diversi modi di ottenere e filtrare le informazioni correlate per un tipo di entità aziendale basata su parametri contestuali e come dovrebbe essere integrato in modo da massimizzare la coerenza ed evitare di violare il principio di responsabilità singola?