5
respostas

Escolha do observer

E se na interface AcaoAposGerarNota eu quisesse ou necessitase criar outros métodos além do exeplo e com nomes mais expressivos.

public interface AcaoAposGerarNota {

    public void executa(NotaFiscal nf);
    public void enviarPorEmail(NotaFiscal nf);
    public void emitirRelatorio(NotaFiscal nf);

}

se eu fizer minha dao implementar essa interface eu precisaria implementar esses métodos que eu acho que não faz sentido dentro da classe dao

5 respostas

Esses métodos que vc adicionou, na verdade, deveriam virar classes com esses nomes.. aí vc teria algo assim:

class EnviaPorEmail implements AcaoAposGerarNota {
    executa(NotaFiscal nf){
     . . . .
    }
}

Aí vc não mataria seu dao e manteria o código desacoplado e coeso.

Ainda o nome do método não diz muito sobre ele, se eu escrevesse assim

public interface AcaoAposGerarNota {

    public void gerarPDF(NotaFiscal nf);
    public void salvar(NotaFiscal nf);

}

Uma classe que realiza uma ação após gerar a nota que implementa essa interface precisaria implementar métodos que poderia não fazer sentido para ela

public class EnviaPorEmail implements AcaoAposGerarNota {


}

Como voce vai chamar estes métodos de maneira genérica?

Essa dúvida aqui ficou para trás, perdão. Na interface só vai ter o executa...

E aí, vc pode ter um ponto do seu código assim:

executaAcoes(NF nf, Collection<AcaoAposGerarNota> acoes) {
  acoes.foreach(a -> a.executa(nf));
}

Boa noite!

Gostaria de reproveitar esta thread para discutir uma dúvida/design.

Seguindo o exemplo da aula, tendo a interface:

public interface AcaoAposGerarNota {
    void executa(NotaFiscal nf);
}

Seria melhor eu criar um método no DAO que chame outro mais expressivo, como:

public class NotaFiscalDao implements DAO<NotaFiscal>, AcaoAposGerarNota {
    public void executa(NotaFiscal nf) {
        salva(nf);
    }
    public void salva(NotaFiscal nf) { ... }
    public NotaFiscal buscaPorID( ...) { ... }
}

Ou seria melhor criar uma classe observadora apenas para aquele evento de criação de NF e que implemente a AcaoAposGerarNota e use um DAO, ficando assim acoplado à esse via interface.

public class SalvadorNFGerada implements AcaoAposGerarNota {
    private DAO<NotaFiscal> dao;
    (construtor com arg...)
    public void executa(NotaFiscal nf) {
        dao.salva(nf);
    }
}

Muito obrigado!