Olá a todos!
Tenho uma dúvida quanto à implementação do padrão State.
Vou expor meu exemplo prático para tentar explicar exatamente onde quero chegar.
Tenho um CRUD de Nota Fiscal no meu sistema. Cada nota fiscal pode estar EMITIDA (acabou se ser cadastrada), CANCELADA e LIQUIDADA (ver o diagrama de estados e de classes).
Minhas dúvidas são as seguintes:
- Os estados são da minha camada de modelo? Ou estariam na camada de negócios?
- É correto ter na implementação de cada método das classes concretas de NotaState todo o negócio da transição de estado? Por exemplo, ao cancelar uma nota fiscal Faturada, eu devo cancelar as Contas a Pagar/Receber geradas por esta nota antes de cancelá-la (entenda este processo como, para cada Conta a Pagar/Receber eu devo atualizar seu estado no Banco de Dados e em seguida alterar o estado da nota fiscal e persistí-lo também).
Este procedimento de persistência deve ser chamado pelo método “cancelar()” da classe concreta Faturada? Ou este método vai apenas me retornar um “sim” ou “não” para executar o procedimento?
A princípio implementar todo o procedimento dentro do método “cancelar()” me pareceu mais correto, já que a intenção do padrão State é facilitar a transição de estados diminuindo o número de testes e deixando mais coeso o tratamento de cada transição.
Porém, o Analista que me passou este trabalho me recomendou que eu não fizesse a parte de persistência através dos métodos de NotaState, mas sim a partir do meu Controller. O State está me servindo simplesmente como alguém que só me diz “pode fazer isto” ou “não pode fazer isto”. Desta maneira, em alguns casos, tenho que fazer a “gambiarra” de guardar o Estado anterior para saber o que caminho devo seguir.
Bem… Será que fui claro?
Alguém tem alguma idéia?
Gostaria de discutir sobre isto.
Obrigado!

