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;).