Obecnie pracuję jako programista solo nad moim obecnym projektem. Projekt odziedziczyłem od innego programisty, który odszedł z firmy. Jest to aplikacja internetowa w stylu kontrolera widoku modelu w języku C #. Używa Entity Framework do mapowania relacyjnego obiektu. Istnieją dwa różne zestawy klas dla typów w modelu domeny. Jeden zestaw służy do interakcji z ORM, a drugi jest używany jako modele w systemie MVC. Na przykład mogą istnieć dwie klasy:
public class Order{
int ID{get;set;}
String Customer{get;set;}
DateTime DeliveryDate{get;set;}
String Description{get;set;}
}
i
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
}
}
Mogę wymyślić kilka wad tego podejścia (więcej miejsc do zmiany kodu, jeśli coś się zmieni, więcej obiektów siedzi w pamięci, więcej czasu spędzonego na kopiowaniu danych), ale nie jestem pewien, jakie są zalety tego rozwiązania. Chyba większa elastyczność klas modelowych? Ale mogłem to osiągnąć, również podklasując klasy jednostek. Moją skłonnością byłoby połączenie tych dwóch grup klas lub ewentualnie, aby klasy modeli były podklasami klas jednostek. Czy brakuje mi więc czegoś ważnego? Czy to typowy wzorzec projektowy, o którym nie wiem? Czy istnieją dobre powody, aby nie przejść przez refaktor, który rozważam?
AKTUALIZACJA
Niektóre odpowiedzi tutaj uświadamiają mi, że w moim początkowym opisie projektu brakowało pewnych ważnych szczegółów. W projekcie istnieje także trzecia grupa klas: klasy modelu strony. Są one faktycznie używane jako model kopii strony. Zawierają również informacje specyficzne dla interfejsu użytkownika i nie byłyby przechowywane z zamówieniem w bazie danych. Przykładową klasą modelu strony może być:
public class EditOrderPagelModel
{
public OrderModel Order{get;set;}
public DateTime EarliestDeliveryDate{get;set;}
public DateTime LatestAllowedDeliveryDate{get;set;}
}
Całkowicie widzę, że użyteczność tej trzeciej grupy jest tutaj odrębna i nie planuję łączyć jej z czymś innym (chociaż mógłbym zmienić jej nazwę).
Klasy w grupie modeli są obecnie również używane przez interfejs API aplikacji, do którego również chciałbym się dowiedzieć, czy to dobry pomysł.
Powinienem również wspomnieć, że klient reprezentowany tutaj jako ciąg znaków miał uprościć przykład, a nie dlatego, że faktycznie jest reprezentowany w ten sposób w systemie. Rzeczywisty system ma klienta jako odrębny typ w modelu domeny z własnymi właściwościami