O que são Value-Objects?

Value Objects são peças fundamentais no design de software. Eles representam um conceito ou um elemento do domínio que não possui identidade própria, mas são definidos pelo seu conjunto de atributos. Ao contrário de entidades, que são identificadas por um identificador único, os value objects são imutáveis e comparados através de seu valor.

Papel na Camada de Domínio:

  1. Imutabilidade: Value Objects são imutáveis. Uma vez criados, seus valores não podem ser alterados. Isso garante consistência e segurança em operações que dependem desses objetos.
  2. Reuso e Composição: Value Objects promovem reusabilidade e composição. Eles podem ser usados em diferentes partes do domínio, permitindo a composição de objetos complexos a partir de objetos mais simples.
  3. Rich Domain Model: Ao usar Value Objects, você enriquece o modelo de domínio, encapsulando lógica de negócios dentro dos próprios objetos ao invés de espalhar lógica pelo código.

Por exemplo. Vamos considerar um sistema de pedidos. Um Endereco pode ser representado como um Value Object:

class Endereco {
  constructor(
    public readonly rua: string,
    public readonly cidade: string,
    public readonly estado: string,
    public readonly cep: string
  ) {
    if (!this.isValidCep(cep)) {
      throw new Error('CEP inválido');
    }
  }

  private isValidCep(cep: string): boolean {
    // Lógica de validação de CEP
    return /\d{5}-\d{3}/.test(cep);
  }
}

const endereco1 = new Endereco('Rua A', 'Cidade B', 'Estado C', '12345-678');
const endereco2 = new Endereco('Rua A', 'Cidade B', 'Estado C', '12345-678');

console.log(endereco1 === endereco2); // false
console.log(JSON.stringify(endereco1) === JSON.stringify(endereco2)); // true

Neste exemplo, Endereco é um Value Object. Ele encapsula a lógica de validação do CEP e é comparado por valor, não por identidade.

Você poderia usar outros Value Objects no seu domínio, como Moeda, Quantidade, NomeCompleto, entre outros. O uso de Value Objects ajuda a criar um modelo de domínio mais expressivo e consistente.

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