C# - DTO x Value Object x POCO


Com certeza você já ouvir falar em DTO, Value Object e POCO.

O que significam cada um destes termos e quais as diferenças conceituais entre eles ?

Vamos começar com a definição de DTO, Value Object e POCO.

Teriam essas siglas os mesmos conceitos podendo ser usadas de forma intercambiável ?

Vejamos...

DTO - Data Transfer Object

DTO é um padrão de projeto usado para transportar dados entre diferentes componentes de um sistema, diferentes instâncias ou processos de um sistema distribuído ou diferentes sistemas via serialização.

Assim, DTO é uma classe que representa dados sem lógica que normalmente é usada para transferir dados entre diferentes aplicativos ou diferentes camadas em um único aplicativo.

Value Objects (VO)

Value Objects, segundo a abordagem Domain Drive Design, são objetos sem identidade conceitual e que dão característica a algum outro objeto. Um Value Object é um membro completo do seu modelo de domínio estando em conformidade com as mesmas regras da entidade(Entity).

A única diferença entre Value Object e a Entity (Entidade) é que um Value Object não possui sua própria identidade. Isso significa que dois Value Objects com o mesmo conjunto de propriedades devem ser considerados os mesmos, ao passo que duas Entities diferem mesmo se suas propriedades forem correspondentes.

Os Value Objects contêm lógica e, normalmente, não são usados​​ para transferir dados entre limites de aplicativo.

POCO - Plain Old CLR Objects

POCO significa Plain Old CLR Objects, e, é uma classe que não depende de nenhuma classe base específica de framework. (Foi criado como uma analogia a POJO - Plain Old Java Objects)

É como qualquer outra classe normal usada na plataforma .NET, por isso eles são chamados de objetos CLR antigos (old). As classes POCO implementam apenas a lógica de negócios do domínio do Aplicativo.
 
Construir uma classe POCO é escrever uma classe com  atributos, construtores e métodos mas que não dependam de nada mais do que o próprio .Net Framework forneça.
 
As entidades POCO são também conhecidas como objetos ignorantes à persistência sendo classes tão simples quanto possível para o objetos de domínio.

Como relacionar DTO, VO e POCO ?

Existe alguma conexão entre esses termos ?

Sim, existem algumas...

Em primeiro lugar, DTO e Value Object representam conceitos diferentes e não podem ser usados ​​de maneira intercambiável.

Por outro lado, POCO é um superconjunto para DTO e Value Object.

Assim,  um Value Object e um DTO não devem herdar nenhum componente corporativo pesado e portanto são POCOs.

Ao mesmo tempo, POCO é um conjunto mais amplo: podendo ser um Value Object, uma Entity, um DTO ou qualquer outra classe que você possa criar, desde que não herde a complexidade do seu domínio.

A tabela a seguir relaciona dados, lógica e identidade entre esses conceitos:

   DTO Value Object POCO
Contém dados Sim Sim Sim
Contém Lógica Não Sim Sim/Não
Tem Identidade Não Não Sim/Não

Percebemos que um objeto POCO pode ter ou não sua própria identidade.Isso vai depender de qual tipo de POCO ele é : Value Object ou Entity.

Além disso, um POCO pode ou não conter lógica nele. Depende se ele for ou não é um DTO.

Concluindo:

- DTO é diferente de Value Object
- DTO esta contido no POCO
- Value Object esta contido no POCO

E estamos conversados...

"Louvai ao SENHOR, porque ele é bom; porque a sua benignidade dura para sempre.
Louvai ao Deus dos deuses; porque a sua benignidade dura para sempre.
Louvai ao Senhor dos senhores; porque a sua benignidade dura para sempre."
Salmos 136:1-3

Referências:


José Carlos Macoratti