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

Organização de funções de modo diferente

Compartilhando aqui o modo como organizei as funções. Mesmo sem adicionar mais classes acredito que ficou bem enxuto. Mas entendo que dependendo da complexidade do projeto o uso de classes é mais indicado. Além de que têm alguns trechos do código que se repetem acredito que pode ficar mais limpa essa função.

from validate_docbr import CPF, CNPJ
import sys

class ValidaDocumento:
    def __init__(self, documento, tipoDocumento):
        self.tipoDocumento = tipoDocumento
        if (tipoDocumento == 'cpf'):
            self.validaCPF(documento)
        elif (tipoDocumento == 'cnpj'):
            self.validaCNPJ(documento)
        else:
             raise ValueError ("Tipo não existe! use 'cpf' or 'cnpj'")



    def __str__(self): #é chamado quando alguem da print
        if self.tipoDocumento == 'cpf':
            return self.cpf
        if self.tipoDocumento == 'cnpj':
            return self.cnpj

    def validaCPF(self, doc):
        try:
            cpf = str(doc)
            cpf = cpf.replace(".", "")
            cpf = cpf.replace("-", "")
            cpf = cpf.strip()
            cpf = cpf.zfill(11)
            if(len(cpf) != 11):
                raise ValueError ("Quantidade de digitos inválida!!")

            validadorCpf = CPF()
            if (validadorCpf.validate(cpf)):
                self.cpf = validadorCpf.mask(cpf)
            else:
                raise ValueError ("cpf invalido")
        except Exception as e:
            print (e)
            sys.exit(1)

    def validaCNPJ(self, doc):
        try:
            cnpj = str(doc)
            cnpj = cnpj.replace(".", "")
            cnpj = cnpj.replace("/", "")
            cnpj = cnpj.replace("-", "")
            cnpj = cnpj.strip()
            cnpj = cnpj.zfill(14)
            if len(cnpj)!= 14:
                raise ValueError ("Quantidade de digitos inválida!!")

            validadorCNPJ = CNPJ()           
            if(validadorCNPJ.validate(cnpj)):
                self.cnpj = validadorCNPJ.mask(cnpj)
            else:
                raise ValueError ("cnpj invalido")
        except Exception as e:
            print (e)
            sys.exit(1)









if(__name__ == "__main__"):
    cpf = 12818792746
    objetoCpf = ValidaDocumento(cpf, 'cpf')
    print(objetoCpf)

    exemplo_cnpj = 35379838000112
    cnpj = ValidaDocumento(exemplo_cnpj, 'cnpj')
    print(cnpj)
1 resposta
solução!

Olá Gustavo, tudo bem com você?

Na área de programação é comum que tenha diversas formas de se chegar a um resultado, em alguns casos, algumas soluções serão mais performáticas do que outras, tanto em tempo de execução, quanto em qualidade de código. Sua proatividade em ir além do que foi ensinado na aula e buscar sua própria implementação é super válida e incentivo que você continue praticando e evoluindo seus estudos desse modo. O seu código, apesar de não ser igual ao do instrutor, cumpre o objetivo e está legível. O padrão de projeto Factory escolhido pelo instrutor teve o objetivo didático, para demonstrar a implementação e seu uso.

A Factory ensinada no curso é um padrão de projeto, ou seja, uma boa prática de código para quando temos situações que tenham instanciação de diversas classes e que isso dependa de algumas condições para acontecer - uma factory é uma fábrica e nesse caso, uma fábrica de objetos, que podem ser de tipos iguais ou diferentes, a depender da condição. Vale ressaltar que 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.

Caso queira evoluir ainda mais seus estudos e 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.

Lembre-se que pode contar sempre com o fórum Alura, seja para postar o seu desenvolvimento ou para tirar suas dúvidas.

Fico à disposição.

Abraços e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software