1
resposta

[Dúvida] Validação do cpf no construtor de uma classe que representa uma entidade

Estou com uma dúvida em relação ao clean archtecture. Eu entendi que a arquitetura limpa é uma maneira de modelar o software de uma maneira que ele esteja desacoplado dos frameworks, ou seja o que o software tem que fazer deve estar separado de como ele deve fazer, assim podemos "facilmente" alterar a maneira de como fazemos o que o software se propõe a fazer. Porém logo no início, vi que a instrutora adicionou no construtor da classe usuário, validações do cpf. Isso não fere os princípios de boas práticas da programação? a classe de domínio deve representar uma entidade que irá ser persistida, não faz sentido ela validar cpf no seu construtor. A arquitetura está desacoplada, mas ao validar um cpf no construtor você está ferindo um dos princípios SOLID de responsabilidade única.

1 resposta

Olá, Alessandro. Tudo bem?

Você levantou uma questão muito interessante sobre a Clean Architecture e os princípios do SOLID, especialmente o princípio da responsabilidade única (SRP). Vamos tentar esclarecer isso.

Na Clean Architecture, a ideia é manter as regras de negócio e a lógica de aplicação separadas de detalhes de implementação, como frameworks e bancos de dados. No entanto, quando falamos sobre validação de dados, como o CPF, estamos lidando com uma regra de negócio importante. A validação de um CPF pode ser vista como parte das regras de negócio, pois um CPF inválido não deveria ser aceito no sistema.

Colocar a validação no construtor pode parecer que estamos misturando responsabilidades, mas, na verdade, estamos garantindo que a entidade seja sempre válida quando criada. Isso pode ser visto como uma forma de proteger a integridade da entidade. No entanto, é importante que essa validação seja feita de uma maneira que não acople a entidade a detalhes de implementação específicos.

Uma abordagem que você pode considerar é criar um serviço de validação separado que seja chamado antes de instanciar a entidade, ou mesmo dentro do construtor, mas mantendo a lógica de validação desacoplada. Por exemplo:

public class Usuario {
    private String cpf;

    public Usuario(String cpf) {
        if (!CpfValidator.isValid(cpf)) {
            throw new IllegalArgumentException("CPF inválido");
        }
        this.cpf = cpf;
    }
}

Neste exemplo, CpfValidator é uma classe ou serviço separado que contém a lógica de validação do CPF. Isso mantém a responsabilidade de validação separada, mas ainda garante que a entidade Usuario seja sempre criada com um CPF válido.

Espero ter ajudado e bons estudos.

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