O que são Entidades?

No Domain-Driven Design (DDD), Entidades e Value-Objects são conceitos fundamentais. Entidades possuem uma identidade única que as distingue de outras instâncias, mesmo que seus atributos sejam iguais, e podem mudar de estado ao longo do tempo. Value-Objects, por outro lado, são definidos pelos seus atributos, são imutáveis e comparados por valor. Neste artigo, vamos explorar o que são Entidades e seu papel na camada de domínio.

Características das Entidades

  1. Identidade Única: Cada Entidade deve ter um identificador único que a distingue de outras Entidades. Esse identificador pode ser uma propriedade como um ID, um número de série, etc.

  2. Estado Mutável: As Entidades podem mudar seu estado ao longo do tempo. Suas propriedades podem ser modificadas durante seu ciclo de vida.

  3. Ciclo de Vida Próprio: As Entidades têm seu próprio ciclo de vida, desde a criação até a exclusão. Elas podem ser persistidas em um banco de dados, modificadas e eventualmente excluídas.

Exemplo de Implementação de Entidades em TypeScript

1. Definindo uma Entidade Cliente

Vamos criar uma Entidade Cliente que possui atributos como nome, email e idade, e um identificador único.

import { v4 as uuidv4 } from "uuid";

class Cliente {
  public readonly id: string;
  public nome: string;
  public email: string;
  public idade: number;

  constructor(nome: string, email: string, idade: number) {
    this.id = uuidv4(); // Gera um identificador único
    this.nome = nome;
    this.email = email;
    this.idade = idade;
  }

  atualizarEmail(novoEmail: string) {
    // Validação simples de email
    if (!this.validarEmail(novoEmail)) {
      throw new Error("Email inválido");
    }
    this.email = novoEmail;
  }

  private validarEmail(email: string): boolean {
    // Regex simples para validar email
    return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
  }
}

// Uso
const cliente = new Cliente("João Silva", "joao@example.com", 30);
console.log(cliente);

cliente.atualizarEmail("novo.email@example.com");
console.log(cliente);

2. Relacionamento entre Entidades

Vamos agora criar uma Entidade Pedido que possui um relacionamento com a Entidade Cliente. Um Pedido é feito por um Cliente e contém uma lista de produtos.

class Produto {
  public readonly id: string;
  public nome: string;
  public preco: number;

  constructor(nome: string, preco: number) {
    this.id = uuidv4();
    this.nome = nome;
    this.preco = preco;
  }
}

class Pedido {
  public readonly id: string;
  public cliente: Cliente;
  public produtos: Produto[];

  constructor(cliente: Cliente, produtos: Produto[]) {
    this.id = uuidv4();
    this.cliente = cliente;
    this.produtos = produtos;
  }

  calcularTotal(): number {
    return this.produtos.reduce((total, produto) => total + produto.preco, 0);
  }
}

// Uso
const cliente1 = new Cliente("Ana Souza", "ana@example.com", 25);
const produtos = [
  new Produto("Produto A", 50),
  new Produto("Produto B", 30),
];

const pedido = new Pedido(cliente1, produtos);
console.log(`Total do Pedido: R$ ${pedido.calcularTotal()}`);

Conclusão

Entidades são essenciais para modelar o domínio de forma eficaz no DDD. Elas possuem uma identidade única, podem mudar de estado ao longo do tempo e são comparadas por sua identidade. Implementar Entidades em TypeScript permite criar um modelo de domínio robusto e consistente, facilitando a manutenção e evolução do software.

Comentários

Postagens mais visitadas deste blog

Um caso de uso não deve depender de outro caso de uso

O que são Aggregates?

Repositórios não devem ser disponibilizado para os clientes