Atualmente, estou trabalhando como desenvolvedor solo no meu projeto atual. Eu herdei o projeto de outro desenvolvedor, que deixou a empresa. É um aplicativo da web no estilo model-view-controller em C #. Ele usa o Entity Framework para mapeamento relacional de objetos. E há dois conjuntos diferentes de classes para os tipos no modelo de domínio. Um conjunto é usado para interagir com o ORM e o outro é usado como modelos no sistema MVC. Por exemplo, pode haver duas classes da seguinte maneira:
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 pensar em várias desvantagens dessa abordagem (mais lugares para alterar o código se algo mudar, mais objetos guardados na memória, mais tempo gasto copiando dados), mas não tenho certeza de quais são as vantagens aqui. Mais flexibilidade para as classes de modelos, suponho? Mas eu poderia conseguir isso subclassificando as classes de entidade também. Minha inclinação seria mesclar esses dois grupos de classes ou, possivelmente, fazer com que as classes de modelo sejam subclasses das classes de entidade. Então, estou perdendo algo importante aqui? Esse é um padrão de design comum que não conheço? Existem boas razões para não continuar com o refator que estou pensando?
ATUALIZAR
Algumas das respostas aqui estão me fazendo perceber que minha descrição inicial do projeto carecia de alguns detalhes importantes. Também existe um terceiro grupo de classes no projeto: as classes de modelo de página. Eles são os que realmente estão sendo usados como o modelo de backup da página. Eles também contêm informações específicas da interface do usuário e não seriam armazenadas com um pedido no banco de dados. Um exemplo de classe de modelo de página pode ser:
public class EditOrderPagelModel
{
public OrderModel Order{get;set;}
public DateTime EarliestDeliveryDate{get;set;}
public DateTime LatestAllowedDeliveryDate{get;set;}
}
Vejo totalmente a utilidade desse terceiro grupo aqui distinta e não tenho planos de fundi-lo com outra coisa (embora eu possa renomeá-lo).
Atualmente, as classes no grupo de modelos também são usadas pela API do aplicativo, que eu também estaria interessado em ouvir sobre se isso é uma boa ideia.
Também devo mencionar que o cliente que está sendo representado como uma string aqui foi para simplificar o exemplo, não porque ele está sendo representado dessa maneira no sistema. O sistema real tem o cliente como um tipo distinto no modelo de domínio, com suas próprias propriedades