C# - Conceitos DDD - Entidade

 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 :

  1. Tem uma identidade;
  2. Contém objetos de valor;
  3. Pode conter outras Entidades;
  4. Pode ser mutável;

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:


José Carlos Macoratti