Impostazione abbastanza semplice: ho ottenuto un Cart e il carrello ha Items . Ho molti tipi diversi di "prodotti" che non possono davvero essere riassunti in una cosa o anche in un antenato comune, quindi ho deciso invece di creare semplicemente una rappresentazione del prodotto come CartItem , che contiene tutte le informazioni dal prodotto necessarie per effettuare la vendita.
Ecco dove arriva la domanda. Potrei gestirlo in tre modi che vedo. Per questi esempi diremo semplicemente che ho due tipi di "prodotti": Widget s e Gizmo s. Ancora una volta, queste due cose sono così diverse che non ha senso che possano ereditare da qualsiasi classe base.
1) Sia Widget che Gizmo hanno la capacità di creare un Cart Item per rappresentare se stessi, ma ciò richiede sia la conoscenza di CartItem che qualsiasi modifica a CartItem mi imporrà di tocca sia Widget che Gizmo (non ideale, ovviamente)
2) Un CartItem può creare se stesso da un Widget o un Gizmo . Questo sarebbe essenzialmente un pattern factory e richiederebbe CartItem di avere conoscenza sia di Widget che di Gizmo . Questo è meglio del # 1 in quanto non devo apportare modifiche ad ogni tipo di "prodotto" se cambio CartItem , ma io do devo ricordare che se cambio un particolare " prodotto ", quindi devo cambiare il metodo di fabbrica di CartItem per quello. (ancora non ideale, perché Murphy dice che dimenticherò).
3) Usa qualcosa come il controller come "colla". WidgetController e GizmoController avranno AddToCart azioni che traducono Widget o Gizmo , rispettivamente, in CartItem . Questo in realtà presenta gli stessi problemi del # 1, in quanto se CartItem cambia, devo aggiornare tutti i controller "del prodotto" e in effetti si mescola nei problemi del n. 2, nel senso che devo ricordare di mantenere sempre questa mappatura se qualcosa su entrambi i lati cambia. Tuttavia, sembra più simile a un lavoro per il controller: è orientato a trattare con più tipi, mentre sembra semplicemente sbagliato mescolare i tipi a livello di modello.
4) Tre che riesco a vedere; # 4 sarebbe qualcosa che devo ancora considerare che uno di voi individui gentili potrebbe accennare a suggerire.
Sono aperto a qualsiasi commento qui. Se mi manca qualcosa di completamente ovvio, sentitevi liberi di chiamarmi un idiota e indicare quanto sia grande un idiota. Mi piace sentirmi stupido; è quando sto imparando;).