Actualmente estoy trabajando como desarrollador en solitario en mi proyecto actual. Heredé el proyecto de otro desarrollador, que desde entonces dejó la empresa. Es una aplicación web de estilo modelo-vista-controlador en C #. Utiliza Entity Framework para el mapeo relacional de objetos. Y hay dos conjuntos diferentes de clases para los tipos en el modelo de dominio. Un conjunto se usa para interactuar con el ORM y el otro se usa como modelo en el sistema MVC. Por ejemplo, puede haber dos clases de la siguiente manera:
public class Order{
int ID{get;set;}
String Customer{get;set;}
DateTime DeliveryDate{get;set;}
String Description{get;set;}
}
y
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
}
}
Puedo pensar en varios inconvenientes de este enfoque (más lugares para cambiar el código si algo cambia, más objetos sentados en la memoria, más tiempo dedicado a copiar datos), pero no estoy realmente seguro de cuáles son las ventajas aquí. ¿Más flexibilidad para las clases de modelos, supongo? Pero podría obtener eso subclasificando las clases de entidad también. Mi inclinación sería fusionar estos dos grupos de clases, o posiblemente hacer que las clases modelo sean subclases de las clases de entidad. Entonces, ¿me estoy perdiendo algo importante aquí? ¿Es este un patrón de diseño común que no conozco? ¿Hay buenas razones para no seguir con el refactor que estoy contemplando?
ACTUALIZAR
Algunas de las respuestas aquí me hacen darme cuenta de que mi descripción inicial del proyecto carecía de algunos detalles importantes. También hay un tercer grupo de clases que existen en el proyecto: las clases de modelo de página. Son los que realmente se utilizan como modelo que respalda la página. También contienen información específica de la interfaz de usuario y no se almacenarían con un pedido en la base de datos. Una clase de modelo de página de ejemplo podría ser:
public class EditOrderPagelModel
{
public OrderModel Order{get;set;}
public DateTime EarliestDeliveryDate{get;set;}
public DateTime LatestAllowedDeliveryDate{get;set;}
}
Veo totalmente que la utilidad de este tercer grupo es distinta aquí, y no tengo planes de fusionarlo con otra cosa (aunque podría cambiarle el nombre).
Las clases en el grupo de modelos también son utilizadas actualmente por la API de la aplicación, que también me interesaría escuchar comentarios sobre si es una buena idea.
También debo mencionar que el cliente que se representa como una cadena aquí fue para simplificar el ejemplo, no porque en realidad se esté representando de esa manera en el sistema. El sistema real tiene al cliente como un tipo distinto en el modelo de dominio, con sus propias propiedades.