Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Seria uma boa? (Strategy)

Pessoal... Boa tarde...

Seria uma boa eu colocar todos esses impostos como uma classe abstrata ou algo do tipo para "obrigar" a ter o método calcula ?

Outra coisa... Seria uma boa ideia eu receber uma lista, tupla, whatever de impostos_calculaveis(a tal interface, ABC, etc) e varrer esse iteravel executando o calcula de cada? Penso que assim um mesmo orçamento teria vários impostos calculados de uma vez.

Alguém mais familiar com o desenvolvimento python pra né dar essa luz?

2 respostas
from abc import ABC, abstractmethod
from strategy.orcamento import Orcamento

class Imposto_Calculavel(ABC):

    @abstractmethod
    def calcula(self):
        pass

class ISS(Imposto_Calculavel):

    def calcula(self, orcamento):
        return orcamento.valor * 0.1

class ICMS(Imposto_Calculavel):

    def calcula(self, orcamento):
        return orcamento.valor * 0.06


class Calculador_de_impostos():
    def __init__(self, orcamento:Orcamento):
        self.total_impostos = 0.0
        self.orcamento = orcamento

    def calcula_impostos(self, impostos:Imposto_Calculavel):
        self.total_impostos = 0
        for imposto in impostos:
            self.total_impostos += imposto.calcula(self.orcamento)

        return self.total_impostos


orcamento = Orcamento(500)
calculador = Calculador_de_impostos(orcamento)
imposto_um = calculador.calcula_impostos([ICMS(), ISS()])
print(imposto_um)
#imprime 80.0

imposto_dois = calculador.calcula_impostos([ICMS()])
print(imposto_dois)
#imprime 30.0

imposto_tres = calculador.calcula_impostos([ISS()])
print(imposto_tres)
#imprime 50.0


solução

Olá Rafael,

Um jeito mais pythonico é na verdade usar funções, assim vc cria uma função calcula que passa no seu kwargs todos os impostos que vc quer utilizar.

Não sei se consegui me fazer entender, mas posso mostrar esse codigo se te ajudar.

Da uma olhada nesse material, aqui mostra como alguns design patterns podem ser substituidos por alguma feature da linguagem. https://wiki.c2.com/?AreDesignPatternsMissingLanguageFeatures

No caso do strategy higher order functions (funções de primeira ordem) que é o que te falei pra usar, pois no python funções são cidadãos de primeira classe.