1
resposta

[Dúvida] Validação

Posso validar o nome do aluno diretamente na entidade ou devo criar um Value Object específico para o nome e validar no próprio Value Object, garantindo que o nome esteja preenchido e tenha, no mínimo, 5 caracteres?

1 resposta

Olá, Antonio! Tudo bem?

Essa é uma excelente pergunta e bastante relevante quando se trata de Clean Architecture e boas práticas de design de software.

Você pode seguir dois caminhos:

  1. Validação na Entidade: Você pode validar o nome diretamente na entidade do aluno. Isso pode ser mais simples e direto, mas pode acabar misturando responsabilidades, já que a entidade estaria cuidando tanto dos dados quanto das regras de validação.

    class Aluno {
        private $nome;
    
        public function __construct(string $nome) {
            $this->setNome($nome);
        }
    
        public function setNome(string $nome) {
            if (empty($nome) || strlen($nome) < 5) {
                throw new InvalidArgumentException("Nome deve ter no mínimo 5 caracteres.");
            }
            $this->nome = $nome;
        }
    
        public function getNome(): string {
            return $this->nome;
        }
    }
    
  2. Value Object para Nome: Criar um Value Object específico para o nome pode ser uma abordagem mais limpa e alinhada com os princípios da Clean Architecture. Isso separa claramente a responsabilidade da validação para o Value Object, tornando a entidade mais coesa e focada apenas em suas responsabilidades principais.

    class Nome {
        private $valor;
    
        public function __construct(string $valor) {
            if (empty($valor) || strlen($valor) < 5) {
                throw new InvalidArgumentException("Nome deve ter no mínimo 5 caracteres.");
            }
            $this->valor = $valor;
        }
    
        public function getValor(): string {
            return $this->valor;
        }
    }
    
    class Aluno {
        private $nome;
    
        public function __construct(Nome $nome) {
            $this->nome = $nome;
        }
    
        public function getNome(): Nome {
            return $this->nome;
        }
    }
    

A segunda abordagem, utilizando um Value Object, é geralmente recomendada em arquiteturas mais complexas, pois promove uma maior separação de responsabilidades e facilita a manutenção e a evolução do código.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.