Acoplamento e a Estabilidade - PauloGustavo72/solid GitHub Wiki

Acoplamento e a Estabilidade

Esse princípio nos mostra o quanto é ruim/perigoso depender de classes instáveis. A solução para isso é tentar ao máximo evitar dependência com classes instáveis, dependendo de interface por exemplo. Segue uma imagem de classe ruim:

public class GeradorDeNotaFiscal {

    private final EnviadorDeEmail email;
    private final NotaFiscalDao dao;

    public GeradorDeNotaFiscal(EnviadorDeEmail email, NotaFiscalDao dao) {
        this.email = email;
        this.dao = dao;
    }

    public NotaFiscal gera(Fatura fatura) {

        double valor = fatura.getValorMensal();

        NotaFiscal nf = new NotaFiscal(valor, impostoSimplesSobreO(valor));

        email.enviaEmail(nf);
        dao.persiste(nf);

        return nf;
    }

    private double impostoSimplesSobreO(double valor) {
        return valor * 0.06;
    }
}

Percebemos aqui que tem responsabilidade de gerar fatura depende também de enviar e-mail e salvar uma notaFiscal. Porém dependência não é possível evitar 100%. Então devemos depender de coisas mais estáveis, como interface por exemplo:

public class NotaFiscalDao implements AcaoAposGerarNota  {
    public void executa(NotaFiscal nf)  {
        System.out.println("salva nf no banco");
    }
}

public class EnviadorDeEmail implements AcaoAposGerarNota  {

    public void executa(NotaFiscal nf)  {
         System.out.println("Envia e-mail");
    }
}

public class GeradorDeNotaFiscal  {
    private List<AcaoAposGerarNota>  acoes;
    public GeradorDeNotaFiscal(List<AcaoAposGerarNota>  acoes)  {
        this.acoes = acoes;
    }
    public NotaFiscal gera(Fatura fatura)  { 
        double valor = fatura.getValorMensal();
        NotaFiscal nf = new NotaFiscal(valor , impostoSimplesSobre0(valor));
       
       for(AcaoAposGerarNota acao  :  acoes)  {`
            acao.executa(nf);
        }
        return nf;
}

A diferença aqui é que agora dependemos de interfaces (que são mais estáveis) que por possuir mais de uma implementação irá fazer o próximo desenvolvedor pensar mais antes de muda-la.