Hoje vamos apresentar o conceito de Entity (Entidade) no contexto do DDD. |
O conceito de Entity ou Entidade vem do Domain Driven Design definido por Eric Evans em seu livro Domain-Driven Design: Tackling Complexity in the Heart of Software.
Uma Entity é um objeto cuja identidade é importante, e, para ser capaz de determinar a identidade de uma Entity, cada entity tem um ID exclusivo que é atribuído quando a entity é criada e permanece inalterado ao longo da vida da entity.
Duas entities ou entidades do mesmo tipo e com o mesmo ID são consideradas a mesma entidade, mesmo se todas as outras propriedades forem diferentes. Da mesma forma, duas entidades do mesmo tipo e com as mesmas propriedades, mas IDs diferentes, são consideradas entidades diferentes, assim como dois indivíduos com o mesmo nome não são considerados iguais.
Ao contrário dos Value Objects ou objetos de valor, as entidades podem ser mutáveis.
Uma entidade de domínio no contexto do DDD precisa implementar a lógica do domínio ou o comportamento relacionado aos dados da entidade (o objeto acessado na memória).
Se um objeto dentro do domínio do seu sistema pode mudar de estado, então você vai precisar de um identificador único para ele (ID) e ele será uma Entidade.
Por exemplo. Funcionario é uma entidade, pois mesmo que ele mude de nome, endereço ou e-mail. Ele continua sendo o mesmo funcionário.
Assim Entidades (também conhecidos como Objetos de Referência) não são definidas por suas propriedades, mas sim por um fio de continuidade e identidade. Um objeto definido principalmente por sua identidade é então denominado Entity.
Assim uma Entity :
A seguir temos como exemplo de uma Entidade representada pela classe Funcionario:
using System;
namespace CShp_VO1
{
public class Funcionario
{
public Guid Id { get; }
public NomeCompleto Nome { get; }
public Email Email { get; }
public Funcionario(Guid id, NomeCompleto nome, Email email)
{
if (id == Guid.Empty) throw new Exception("Id inválido");
if (nome == null) throw new Exception("Nome inválido");
if (email == null) throw new Exception("Email inválido");
Id = id;
Nome = nome;
Email = email;
}
}
}
|
Analisando o código temos que :
1 - Nossa classe Funcionario possui uma identidade - Id - e dois objetos de valor : NomeCompleto e Email.
2- O estado é passado por meio do construtor parametrizado;
3- As propriedades
Id, Nome e Email são somente leitura. Isso
torna possível fazer a validação e certificamo-nos de que os funcionários criados
estão em um estado válido e são mantidos em um estado válido.
Nosso funcionário é imutável (omitimos o set), mas não é obrigatório
que seja. Em uma base de código real, a classe Funcionario
deve encapsular sua própria lógica de domínio, e, isso torna mais fácil proteger
a entidade de um estado inválido.
No próximo artigo veremos o conceito de Value Object.
E estamos conversados...
"Aquele que diz: "Eu o conheço (Jesus)",
mas não guarda os seus mandamentos, esse é mentiroso, e a verdade não está
nele."
1 João 2:4
Referências:
ASP .NET Core - Criando uma aplicação com Angular 2 - Macoratti.net
ASP .NET Core - Criando uma aplicação Web no ... - Macoratti.net
ADO .NET - Acesso Assíncrono aos dados - Macoratti
C# - Programação Funcional - Exemplos - Macoratti
C# - Coleções Imutáveis - Macoratti
C# 9.0 - Apresentando Records - Macoratti.net
C# - Os 10 Erros mais comuns dos iniciantes - Macoratti
C# - Otimizando o código - Macoratti