C# - Modelo Anêmico x Modelo Rico
Hoje vamos recordar o que é o modelo anêmico e o que é o modelo rico apresentando as diferenças e o uso de cada modelo. |
Definir o modelo de domínio é uma tarefa corriqueira e que é feita quase que automaticamente definindo a classe de domínio e apenas as propriedades que expressam os atributos do objeto sendo modelado. Isso é um padrão definido como modelo anêmico.
Assim um modelo de domínio anêmico é um modelo sem comportamentos onde temos diversas propriedades com get e set definidas sem lógica alguma e onde o cliente(quem vai usar a classe) da classe tem controle sobre como instanciar e modificar a classe.
Exemplo de modelo anêmico:
public class Cliente
{
public int Id{ get; set; }
public string Nome { get; set; }
public string Endereco { get; set; }
}
|
Nesses modelos, o cliente precisa interpretar o objetivo e o uso da classe e a lógica é enviada para outras classes, denominadas serviços da classe de domínio. Com a lógica em outra classe, não há nada que ajude o cliente a navegar ou usar a classe de modelo.
Essa abordagem acarreta muitos problemas e desvantagens de design como :
Nota: Coesão é o nível interno de integradidade de uma classe. Uma classe com alta coesão possui responsabilidades bem definidas e são difíceis de serem desmembradas em outras classes;
Em contrapartida ao modelo anêmico temos o modelo de domínio rico que inclui nas classes de domínio os dados e o comportamento e onde a lógica de domínio faz parte das entidades.
Essa lógica orienta e controla como a entidade é instanciada, validada e operada, impedindo que o cliente tenha entidades com um estado inconsistente.
Exemplo de modelo rico:
public class Cliente { public int Id{ get; private set; } public string Nome { get; private set; } public string Endereco { get; private set; } public Cliente(int id, string nome, string endereco)
{
if (id < 0)
throw new InvalidOperationException();
if (string.IsNullOrEmpty(nome) || string.IsNullOrEmpty(endereco))
throw new InvalidOperationException();
Id = id;
Nome = nome:
Endereco = endereco;
}
}
|
Obs: Para deixar o artigo mais simples não estou entrando nos conceitos de Entity, Value Object, Aggregates e Roots do DDD.
Aqui o cliente da classe somente pode atribuir valores para as propriedades via construtor e os valores estão sendo validados(de forma bem ingênua) o que garante mais consistência ao objeto gerado.
Como evitar o modelo anêmico
Existe uma longa lista de práticas recomendadas que você pode usar para evitar um Modelo de Domínio Anêmico, sendo que isso também depende da complexidade da solução e de quão purista você deseja ser quando for enriquecer seu modelo. (no nosso exemplo adotamos uma abordagem bem simples)
O objetivo deste artigo não é apresentar um estudo completo ou uma lista exaustiva das melhores práticas, mas aqui estão algumas dicas e sugestões para você começar:
Essas diretrizes são bem genéricas mas são simples de seguirem e fáceis de serem implementadas.
O modelo anêmico foi classificado por Martin Fowler como um anti-pattern, mas mesmo assim continua a ser usado e ensinado e talvez isso esteja ocorrendo pelos seguintes motivos:
1- A programação procedural é mais fácil que a programação orientada a objetos.
Modelos de domínio anêmicos têm a lógica de domínio em algumas outras classes de serviço. Quando você trás o comportamento do seu domínio para as classes de serviços do domínio, basicamente está pegando um objeto, operando com ele e seus dados e devolvendo-o ao cliente. Acontece que isso não é POO, é programação procedural.
2- Soluções com baixos requisitos lógicos.
Para algumas
soluções sem lógica de domínio associada, principalmente a operações CRUD, um
Modelo de Domínio Anêmico usando uma arquitetura
MVC pode ser suficiente, e você vai encontrar dezenas de artigos mostrando e
usando essa solução.
Pense bem nisso quando for definir o seu modelo de domínio.
Em outro artigo veremos como tratar exceções neste contexto.
"Dando graças
ao Pai que nos fez idôneos para participar da herança dos santos na luz;
O qual nos tirou da potestade das trevas, e nos transportou para o reino do
Filho do seu amor;"
Colossenses 1:12,13
Referências:
C# - Imprimindo um arquivo texto
C# - Usando OpenFileDialog - Macoratti