Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida no Ex. 4 da Aula 2 - Acoplamento e a estabilidade

Olá, Não é forçado demais o "NotaFiscalDao" mudar o método "persiste" para "executa" só para ficar compatível com interface?

Existe algum padrão que não precisa mudar o nome e ainda sim consiga ficar compatível coma interface? No "mão na massa" eu tentei user o Adapter, mas não sei se seria a melhor solução.

O que acham? Obrigado,

3 respostas

Ola, Henrique Winckler !

Nao acho que ficou forçado nao, até porque com o uso dessa interface ele passa a receber uma List.

No caso do adapter acredito que deve ter ficado bom, porém e no caso de querer adicionar mais uma tarefa, como ficaria?

Ex.: Alem de persistir e enviar por email vc precisar enviar um SMS ?

Nesse caso, basta somente criar a classe para executar o envio do sms fazendo extends de AcaoAposGerarNota e colocar essa classe na mesma lista das outras tarefas.

Poderia postar sua implementação ?

Abraço!

Olá, boa noite. Obrigado por ter respondido.

Ainda acho estranho um "executa" dentro de um DAO, parece fora de contexto.

Tipo: O DAO vai executar o quê? Uma peristência?! Então faz mais sentido o "persiste" ou "salvar".

Também parece errado amarrar o DAO com a interface "AcaoAposGerarNota".

Não entendi quando vc disse: "até porque com o uso dessa interface ele passa a receber uma List." O "executa" da interface recebe só um "NotaFiscal".

Eu tentei usar o Adapter, mas não ficou muito elegante.

Segue o exemplo:

package ex2.dao;

public class DAO<T> {

    public void persiste(T t){
        System.out.println("salva no banco");
    }
}
package ex2.dao;

import ex2.notafiscal.NotaFiscal;

public class NotaFiscalDao extends DAO<NotaFiscal> {
    @Override
    public void persiste(NotaFiscal t) {
        System.out.println("salva no banco nf: " + t.getId());
    }
}
package ex2.email;

import ex2.notafiscal.NotaFiscal;
import ex2.notafiscal.acao.AcaoAposGerarNota;

public class EnviadorDeEmail implements AcaoAposGerarNota{
    public void executa(NotaFiscal nf) {
        System.out.println("envia email da nf " + nf.getId());
    }
}
package ex2.fatura;

import ex2.imposto.Imposto;
import ex2.notafiscal.NotaFiscal;

public class Fatura {
    private double valorMensal;
    private String cliente;

    public Fatura() {}

    public Fatura(double valorMensal, String cliente) {
        this.valorMensal = valorMensal;
        this.cliente = cliente;
    }
    public double getValorMensal() {
        return valorMensal;
    }
    public void setValorMensal(double valorMensal) {
        this.valorMensal = valorMensal;
    }
    public String getCliente() {
        return cliente;
    }
    public void setCliente(String cliente) {
        this.cliente = cliente;
    }

    public NotaFiscal gerarNotaFiscal(Imposto imposto){
        return new NotaFiscal(this.valorMensal, imposto.calcular(valorMensal));
    }
}
package ex2.imposto;

public interface Imposto {

    public double calcular(double valor);
}
package ex2.imposto;

public class ImpostoSimples implements Imposto {

    public double calcular(double valor) {
        return valor * 0.06;
    }

}
package ex2.notafiscal;

public class NotaFiscal {

         private int id;
        private double valorBruto;
        private double impostos;

        public NotaFiscal(int id, double valorBruto, double impostos) {
            this.id = id;
            this.valorBruto = valorBruto;
            this.impostos = impostos;
        }

        public NotaFiscal(double valorBruto, double impostos) {
            this(0, valorBruto, impostos);
        }

        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public double getValorBruto() {
            return valorBruto;
        }
        public void setValorBruto(double valorBruto) {
            this.valorBruto = valorBruto;
        }
        public double getImpostos() {
            return impostos;
        }
        public void setImpostos(double impostos) {
            this.impostos = impostos;
        }

        public double getValorLiquido() {
            return this.valorBruto - this.impostos;
        }

}
package ex2.notafiscal.acao;

import ex2.notafiscal.NotaFiscal;

public interface AcaoAposGerarNota {

    public void executa(NotaFiscal nf);
}
package ex2.notafiscal.adapter;

import ex2.dao.DAO;
import ex2.notafiscal.NotaFiscal;
import ex2.notafiscal.acao.AcaoAposGerarNota;

public class AcaoAposGerarNotaDAOAdapter implements AcaoAposGerarNota{

    private DAO dao;

    public AcaoAposGerarNotaDAOAdapter(DAO dao) {
        this.dao = dao;
    }

    public void executa(NotaFiscal nf) {
        dao.persiste(nf);
    }

}
package ex2.main;

import java.util.Arrays;
import java.util.List;

import ex2.dao.NotaFiscalDao;
import ex2.email.EnviadorDeEmail;
import ex2.fatura.Fatura;
import ex2.imposto.ImpostoSimples;
import ex2.notafiscal.NotaFiscal;
import ex2.notafiscal.acao.AcaoAposGerarNota;
import ex2.notafiscal.adapter.AcaoAposGerarNotaDAOAdapter;

public class Main {

    public static void main(String[] args) {

        EnviadorDeEmail enviadorDeEmail = new EnviadorDeEmail();
        NotaFiscalDao notaFiscalDao = new NotaFiscalDao();

        Fatura fatura = new Fatura(230.52, "Henrique");

        NotaFiscal nf = fatura.gerarNotaFiscal(new ImpostoSimples());

        List<AcaoAposGerarNota> acoes = Arrays.asList(enviadorDeEmail, new AcaoAposGerarNotaDAOAdapter(notaFiscalDao));

        for (AcaoAposGerarNota acaoAposGerarNota : acoes) {
            acaoAposGerarNota.executa(nf);
        }

    }
}

Tenho pouco conhecimento de Patterns, então não tenho certeza se foi bem aplicado. Ainda mais nesse caso.

Abs.

solução!

Ola, Henrique !

Legal seu exemplo com o esquema do adapter, deixou encapsulado o DAO e o DAO nao sabe do AcaoAposGerarNota. Gostei !

O que eu falei de receber uma lista, estava falando sobre a classe que vai executar as ações. Em determinado momento podemos ter varias ações a serem executadas e basta a classe implementar a interface. No caso era a classe DAO.

Na verdade não existe bala de prata, não vejo problema para o exemplo do curso a classe DAO implementar a interface, funcionou bem.

É bem positivo ficar de olho sempre em como melhorar o código assim como em outras alternativas.

Abraço!