Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Atingindo o mesmo resultado sem implementar o Factory

Olá, ANTES de assistir a aula de refatoração eu havia tentado "automatizar" a verificação do tipo do documento (cpf ou cnpj) por me incomodar ter que indicar explicitamente o tipo do documento, porém não usei o Factory por não lembrar desse recurso. Tive diversas dificuldades, mas aparentemente tanto a formatação quanto a validação deu certo.

Mas e em termo de boas práticas?

Claro que como foi feito na aula está bem melhor em legibilidade e simplicidade, porém não queria subir no Github um código feito pelo professor e copiado por mim, entretanto, também não quero subir algo que seja visto com maus olhos por alguma má prática.

Enfim, vamos ao código:

from validate_docbr import CPF, CNPJ


class CpfCnpj:

    def __init__(self, documento):
        documento = str(documento)
        if self.documento_e_valido(documento):
            self.documento = documento
        else:
            raise ValueError("Documento inválido!")

    def __str__(self):
        return self.documento_formatado()

    def verifica_tipo_documento(self, documento):
        if len(documento) == 11:
            tipo_documento = "cpf"
            return tipo_documento
        elif len(documento) == 14:
            tipo_documento = "cnpj"
            return tipo_documento
        else:
            raise ValueError("O documento não tem um tipo válido!")

    def documento_e_valido(self, documento):
        if self.verifica_tipo_documento(documento) == "cpf":
            validador = CPF()
            return validador.validate(documento)
        elif self.verifica_tipo_documento(documento) == "cnpj":
            validador = CNPJ()
            return validador.validate(documento)
        else:
            raise ValueError("Documento inválido!")

    def documento_formatado(self):
        if self.verifica_tipo_documento(self.documento) == "cpf":
            mascara = CPF()
            return mascara.mask(self.documento)
        elif self.verifica_tipo_documento(self.documento) == "cnpj":
            mascara = CNPJ()
            return mascara.mask(self.documento)
        else:
            raise ValueError("Quantidade de digitos inválida!!")

Obs.: Sei que a Factory é útil e ajuda na escalabilidade do código, nesse caso, essencial para adicionar novos documentos sem ter que mexer no código inteiro. Minha questão está nas boas práticas da sua ausência considerando apenas esse código, sem escalabilidade.

1 resposta
solução!

Olá Victor, tudo bem com você?

Peço desculpas pela demora no retorno.

Fico feliz que tenha se desafiado a codificar um projeto antes mesmo de assistir a aula. No início da nossa jornada como programador, é normal nos questionarmos se nosso código está bom ou não. E seu questionamento é super válido.

Quando estamos trabalhando com o Factory ou com outros padrões de projeto, tudo dependerá do escopo, em projetos pequenos por exemplo, fazer o uso de padrões pode apenas aumentar a complexidade do código.

O seu código, apesar de não ser igual ao do instrutor, cumpre o objetivo e está legível, não infringe as boas práticas. O padrão de projeto Factory escolhido pelo instrutor teve o objetivo didático, para demonstrar a implementação e seu uso.

Para conhecer outros padrões de projetos, recomendo a leitura dos artigos presentes no site Refatoring Guru, onde será apresentado com detalhes sobre os padrões Factory Method, Abstract Factory, Decorator, Chain of Responsibility e muitos outros.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

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