Tenho esse código que eu fiz na aula 5:
class Orcamento(object):
def __init__(self):
self.__itens = []
self.estado_atual = EmAprovacao()
self.__desconto_extra = 0
self.__applied_desconto_extra = False
def aprova(self):
self.estado_atual.aprova(self)
def reprova(self):
self.estado_atual.reprova(self)
def finaliza(self):
self.estado_atual.finaliza(self)
def aplica_desconto_extra(self):
self.estado_atual.aplica_desconto_extra(self)
def adiciona_desconto_extra(self, desconto):
if not self.__applied_desconto_extra:
self.__desconto_extra += desconto
self.__applied_desconto_extra = True
else:
raise Exception("Desconto extra já foi aplicado!")
@property
def valor(self):
total = 0.0
for item in self.__itens:
total += item.valor
return total - self.__desconto_extra
def obter_itens(self):
return tuple(self.__itens)
@property
def total_itens(self):
return len(self.__itens)
def adicionar_item(self, item):
self.__itens.append(item)
class Item(object):
def __init__(self, nome, valor):
self.__nome = nome
self.__valor = valor
@property
def valor(self):
return self.__valor
@property
def nome(self):
return self.__nome
if __name__ == '__main__':
from orcamento import Item
orcamento = Orcamento()
orcamento.adicionar_item(Item("Item - 1", 100))
orcamento.adicionar_item(Item("Item - 1", 50))
orcamento.adicionar_item(Item("Item - 1", 400))
print orcamento.valor
orcamento.aplica_desconto_extra()
print orcamento.valor
orcamento.aplica_desconto_extra()
print orcamento.valor
Na resolução original, a lógica de checagem da aplicação do desconto extra é feita na classe "Estado_de_um_orcamento" e nas suas classes filhas, e também a checagem é colocada duas vezes: uma na classe "Em_aprovacao" e outra em "Aprovado".
Na minha resolução, a lógica da checagem é colocada uma única vez no método "adiciona_desconto_extra" da classe "Orcamento".
O resultado saiu assim:
python2 orcamento.py
550.0
539.0
Traceback (most recent call last):
File "orcamento.py", line 184, in <module>
orcamento.aplica_desconto_extra()
File "orcamento.py", line 123, in aplica_desconto_extra
self.estado_atual.aplica_desconto_extra(self)
File "orcamento.py", line 30, in aplica_desconto_extra
orcamento.adiciona_desconto_extra(orcamento.valor * 0.02)
File "orcamento.py", line 131, in adiciona_desconto_extra
raise Exception("Desconto extra já foi aplicado!")
Exception: Desconto extra já foi aplicado!
Gostaria de um feedback do pessoal. Essa solução seria viável ao design pattern State que vimos? Ou a resolução original seria melhor em questão de manutenção de código e legibilidade?
EDITADO: Achei um erro na minha implementação. Se o estado mudar, o desconto não poderá ser aplicado referente aquele novo estado do orçamento, pois a flag de desconto_extra vai ser "True" sempre e não irá mudar. Desculpa o encômodo pessoal, irei corrigir ele!