1
resposta

Não entendi a resposta

Pelo que vi, não existe a figura de classes filhas no código, já que não foi feita herança em nenhum lugar. E pensando bem, os métodos não precisam ser necessáriamente iguais, até porque poderíamos inserir diferentes comportamentos para cada tipo de documento, ex: consultar pontos da CNH, consultar score do CPF, consultar a inscrição municipal de um CNPJ e etc.

from validate_docbr import CPF, CNPJ

class Documento:

    @staticmethod
    def cria_documento(documento):
        if len(documento) == 11:
            return DocCpf(documento)
        elif len(documento) == 14:
            return DocCnpj(documento)
        else:
            raise ValueError("Quantidade de dígitos incorreta!")

class DocCpf:
    def __init__(self, documento):
        if self.valida(documento):
            self.cpf = documento
        else:
            raise ValueError("Cpf inválido!")

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

    def valida(self, documento):
        validador = CPF()
        return validador.validate(documento)

    def format(self):
      mascara = CPF()
      return mascara.mask(self.cpf)

class DocCnpj:
    def __init__(self, documento):
        if self.valida(documento):
            self.cnpj = documento
        else:
            raise ValueError("Cnpj inválido!")

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

    def valida(self, documento):
        mascara = CNPJ()
        return mascara.validate(documento)

    def format(self):
        mascara = CNPJ()
        return mascara.mask(self.cnpj)

E uma dúvida, que não necessariamente tem haver com as perguntas, é: Porque ter a classe Documento(), que serve para chamar as outras classes DocCpf() ou DocCnpj() de acordo com o tamanho do doc, e dentro dessas classes estanciar as classes CPF() e CNPJ() vazias, somente para utilizar o método de validação e formatação? Porque não utilizar uma arquitetura mais simples e direta, já que até essa fase do curso, a gente já viu basicamente tudo que foi criado manualmente na aula?

1 resposta

Acho que o objetivo foi mais mostrar uma visão avançada da programação orientada a objetos utilizando padrões de projeto mais especificamente o Factory method, o benefício é não precisar pensar pra criar o objeto, nesse caso cpf e cnpj é tranquilo ver a diferença mas em outros casos creio que seja interessante ter um classe que analisa os dados e já cria o objeto na classe que ele se encaixa.