Parte della sfida che stai affrontando è perché non stai separando le responsabilità in modo appropriato. Devi inoltre separare la logica o il costrutto di dati dell'ordine dall'ordine fisico che verrà inserito.
Iniziamo con gli ordini. Dovresti avere una classe MyMfgOrder
che contenga tutte le informazioni necessarie per generare un ordine personalizzato. Questo sarà strettamente correlato al modulo standard che hai menzionato, ma potrebbe avere estensioni dovute ai requisiti del modulo personalizzato. Questo è il tuo costrutto logico del modulo d'ordine.
Successivamente, avrai bisogno di classi per il modulo d'ordine personalizzato di ogni venditore, come VendorAMfgOrder
. Per semplificare la tua vita, prendi il tuo MyMfgOrder
come parte del costruttore e poi fai compilare il modulo personalizzato in base alla classe del tuo modulo d'ordine. Questo sarebbe uno dei numerosi costrutti di ordine fisico.
Seguirò la classe Vendor
a questo punto. Il Vendor
ha alcune proprietà specifiche, ad esempio se richiedono un modulo personalizzato e qualsiasi data associata alla consegna. La localizzazione di queste proprietà risale alla responsabilità: il Vendor
"possiede" la necessità di un modulo personalizzato e i relativi requisiti di consegna.
Quando vai a lavorare con un'istanza del logico MyMfgOrder
, alla fine dovrai selezionare un Vendor
prima di effettuare l'ordine. Una volta selezionato Vendor
, dovrai compilare le informazioni sulla scadenza di consegna per quel fornitore e il tipo di modulo d'ordine accettato.
Nel mio esempio qui sotto, non ho davvero specificato come tenere traccia dei particolari moduli da usare perché non hai specificato una lingua particolare. E ci sono diversi modi per tenere traccia di ciò che deve essere la forma finale attraverso enumerazioni, generici, array o cosa no. Il punto è che MyMfgOrder
rappresenta una vista logica dell'ordine che dovrà essere trasformato in una vista fisica dell'ordine inoltrato al fornitore effettivo. È opportuno che la vista logica comprenda quale dovrebbe essere la forma fisica.
Rompere le cose in questo modo ti permette di tenere traccia delle preoccupazioni immediate con alcuni venditori e i loro particolari cicli di consegna. Questo ti struttura anche in modo da poter confrontare i requisiti di più fornitori uno contro l'altro per lo stesso ordine personalizzato. Usando un ordine logico separato dal fisico, si acquista quella capacità di comparare. È inoltre possibile utilizzare il costrutto logico per generare ordini personalizzati ripetuti che sono indipendenti da un particolare fornitore poiché il modulo ordine fisico è derivato dal modulo logico.
Ecco alcuni esempi di codice per strutturare le classi come discusso.
public class MyMfgOrder
{
Vendor PrefVendor;
string StockNumber;
int Quantity;
float QuotedCost;
DateTime QuotedDelivery;
DateTime MustDeliverBy;
DateTime MustPayBy;
object FormToSubmit;
}
public class VendorAMfgOrder
{
VendorAMfgOrder(MyMfgOrder myOrder) { }
}
public class Vendor
{
bool RequiresCustForm;
object CustFormType;
DateTime DeliveryDeadlineCycle;
DateTime PaymentDeadlineCycle;
}