Sto lavorando al modello di dominio di un'applicazione che memorizza le informazioni fornite dai venditori sui prodotti che vendono su una piattaforma. L'applicazione funge semplicemente da archivio dati per queste informazioni. Le informazioni sono chiamate "ProductFact" e possono essere diverse. Ogni esempio di seguito rappresenta un'istanza "ProductFact".
- il prezzo di vendita dell'articolo per il pubblico in generale.
- lo sconto che il venditore può offrire ad alcuni clienti specifici (a importo assoluto, o percentuale del prezzo di vendita).
- la quantità minima che un cliente deve acquistare per usufruire della spedizione gratuita.
Quanto sopra sono alcuni casi che sono noti al momento, ma potrebbero essercene altri in futuro, senza alcuna garanzia di condivisione di alcuna proprietà con i "ProductFact" già esistenti. Diversi client chiameranno questa applicazione, ognuno alla ricerca di un tipo specifico di "ProductFact".
Useremo un backend NoSQL, quindi lo schema db non è un problema. Il problema è con il livello dell'applicazione. Non sono sicuro di come modellare questo particolare oggetto. Ho provato a modellarlo come:
public class ProductFact {
private ProductFactType productFactType; //enum for different types like SELLING_PRICE, DISCOUNTS, MIN_QUANT, etc.
private ProductFactData productFactData; // for representing the actual data.
}
Sarebbe stato ideale se ProductFactData avesse un comportamento, quindi avrei potuto usarlo come interfaccia e creato implementazioni o ogni caso d'uso. Ma questo è solo dati, e l'ereditarietà sembra essere un approccio hacky.
Un altro approccio potrebbe essere:
public class ProductFact {
private ProductFactType productFactType;
private SellingPriceFactData sellingPriceFactData;
private DiscountFactData discountFactData;
.
.
.
private SomeProductFactData someProductFactData;
}
Il client può verificare il valore di "productFactType" e quindi chiamare il getter per il tipo FactData appropriato.Ma anche questo approccio sembra hacky.
Quale sarebbe un buon modo di modellare questo scenario?
Modifica
Sembra che l'affermazione del problema potrebbe usare un po 'più di chiarezza. Sconto e prezzo sono due dei tanti pezzi "ProductFact" che l'applicazione potrebbe memorizzare. Ci potrebbero essere altri in futuro, tra cui:
- Informazioni sull'eleggibilità della consegna espressa del prodotto, ad esempio "ExpressDeliveryProductFact" - quali aree sono disponibile per, qual è la quantità minima richiesta.
- Informazioni sulla condizione del prodotto - è usato, nuovo?
Ci sarebbero diversi client che interrogano questa applicazione, ognuno dei quali cerca il tipo di ProductFact a cui è interessato. Ad esempio, un client DeliveryService sarebbe interessato a "ExperssDeliveryProductFact".
Come si può vedere, queste informazioni apparentemente non hanno nulla in comune, che pone problemi nel modello di dominio.