Attualmente sto lavorando come sviluppatore solista sul mio progetto attuale. Ho ereditato il progetto da un altro sviluppatore, che da allora ha lasciato l'azienda. È un'applicazione web in stile controller vista modello in C #. Utilizza Entity Framework per la mappatura relazionale degli oggetti. E ci sono due diversi insiemi di classi per i tipi nel modello di dominio. Un set viene utilizzato per interagire con l'ORM e l'altro viene utilizzato come modelli nel sistema MVC. Ad esempio, potrebbero esserci due classi come segue:
public class Order{
int ID{get;set;}
String Customer{get;set;}
DateTime DeliveryDate{get;set;}
String Description{get;set;}
}
e
public class OrderModel{
String Customer{get;set;}
DateTime DeliveryDate{get;set;}
String Description{get;set;}
public OrderModel( Order from){
this.Customer= from.Customer;
// copy all the properties over individually
}
public Order ToOrder(){
Order result =new Order();
result.Customer = this.Customer;
// copy all the properties over individually
}
}
Posso pensare a diversi inconvenienti di questo approccio (più posti per cambiare codice se qualcosa cambia, più oggetti seduti in memoria, più tempo impiegato per copiare i dati), ma non sono sicuro di quali vantaggi ci siano. Più flessibilità per le classi del modello, suppongo? Ma ho potuto ottenerlo anche sottoclassando le classi di entità. La mia inclinazione sarebbe quella di unire questi due gruppi di classi, o possibilmente avere le classi del modello in sottoclassi delle classi di entità. Quindi mi sto perdendo qualcosa di importante qui? È un modello di design comune di cui non sono a conoscenza? Ci sono buone ragioni per non passare attraverso il refactor che sto contemplando?
AGGIORNARE
Alcune delle risposte qui mi stanno facendo capire che nella mia descrizione iniziale del progetto mancavano alcuni dettagli importanti. Esiste anche un terzo gruppo di classi esistenti nel progetto: le classi del modello di pagina. Sono quelli effettivamente utilizzati come modello a supporto della pagina. Contengono inoltre informazioni specifiche dell'interfaccia utente e che non verrebbero archiviate con un ordine nel database. Una classe di modello di pagina di esempio potrebbe essere:
public class EditOrderPagelModel
{
public OrderModel Order{get;set;}
public DateTime EarliestDeliveryDate{get;set;}
public DateTime LatestAllowedDeliveryDate{get;set;}
}
Vedo totalmente l'utilità di questo terzo gruppo qui distinta, e non ho intenzione di fonderlo con qualcos'altro (anche se potrei rinominarlo).
Le classi nel gruppo di modelli sono attualmente utilizzate anche dall'API dell'applicazione, che sarei anche interessato a sentire input su se questa è una buona idea.
Vorrei anche ricordare che il cliente rappresentato qui come una stringa doveva semplificare l'esempio, non perché in realtà veniva rappresentato in quel modo nel sistema. Il sistema reale ha il cliente come un tipo distinto nel modello di dominio, con le sue proprietà