1
resposta

[Dúvida] Não entendi a resposta Mais sobre Factories

Realmente é a resposta que mais faz sentido, mas acabei ficando confuso com a explicação, porque os métodos das classes filhas precisam ser iguais?

Durante esta aula construímos uma factory que decidia entre instanciar uma classe responsável por CPFs e outra por CNPJs. Uma das vantagens de usar esse padrão de projeto é facilitar o crescimento do código.

Avalie as afirmativas abaixo sobre as alterações necessárias, no caso de inserirmos um documento novo, e indique qual é a verdadeira.
A nova classe precisará ter todos os métodos com os mesmos nomes das outras classes filhas.

Explicação:
Correto! Para conseguirmos usar qualquer instância retornada pelo Factory livremente, os métodos das classes filhas precisam ser iguais.

Código:

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 inválida!')

    class DocCpf:

    def __init__(self, documento):
        if self.valida_cpf(documento):
            self.cpf = str(documento.lower())
        else:
            raise ValueError('CPF inválido!!') 


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

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

    def formata_cpf(self):
        cpf_formatado = CPF()
        return cpf_formatado.mask(self.cpf)

class DocCnpj:
    def __init__(self, documento):
        if self.valida_cnpj(documento):
            self.cnpj = documento
        else:
            raise ValueError('CNPJ inválido!!')

    def valida_cnpj(self, documento):
        validador = CNPJ()
        return validador.validate(documento)

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

    def formata_cnpj(self):
        cnpj_formatado = CNPJ()
        return cnpj_formatado.mask(self.cnpj)
1 resposta

Olá Tiago, como você está?

Peço desculpas pela demora em obter um retorno.

É uma boa prática do padrão Factory que os métodos sejam iguais, mas não uma obrigatoriedade. Quando os métodos são iguais, facilita o uso e manutenibilidade das instâncias retornadas pela Factory, pois podemos tratá-las de forma mais genérica, sem precisar conhecer os detalhes específicos de cada classe.

Por exemplo, imagine que temos uma lista de documentos e queremos percorrer essa lista e chamar um método chamado valida_documento() em cada um deles, independentemente de ser um CPF, CNPJ ou outro tipo de documento — para isso funcionar, todos os tipos de documentos precisam ter o método valida_documento() com o mesmo nome e comportamento, ou seja, precisam ter a mesma assinatura (receber os mesmos argumentos e retornar o mesmo tipo de resultado), mesmo que o código dentro do método seja diferente para cada tipo de documento, por isso a importância de manter os métodos com essa similaridade.

Espero ter ajudado a esclarecer a questão. Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Em caso de dúvidas estou à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. 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