dip the dependency inversion principle
TRANSCRIPT
Dependency Inversion Principle
Guilherme PereiraTúlio Guimarães
Classes de baixo nível que realizam operações básicas.
Classes de alto nível com a lógica complexa.
Dependência entre as duas classes.
Rigidez, fragilidade e imobilidade.
Introduzir uma camada de abstração entre as duas classes.
Princípio:
• módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações
• abstrações não devem depender de detalhes. Os detalhes é que devem depender das abstrações
Dois padrões de projeto ajudam a implementar este princípio:
• Template Method• Stragety Method.
Estes dois padrões escondem as especificidades de um algoritmo tanto via herança (Template) ou delegação via uma interface (Strategy)
Antes:
public class Trabalhador {
private Boolean temValeTransporte;private Boolean temValeRefeicao;private double salarioBase;
}
public class ValeRefeicao {
private double vr = 12;
public double retornarValorValeRefeicao(int diasNoMes){return diasNoMes * vr;
}
}
public class CalculadoraSalario {
Trabalhador trabalhador;private int diasUteisMes;
public void CalculadoraSalario(int dias, Trabalhador trab) {trabalhador = trab;diasUteisMes = dias;
}
public double retornarSalarioBase(){return trabalhador.getSalarioBase();
}
public double retornarSomaBeneficios(){double total = 0;
if(trabalhador.getTemValeRefeicao()){
total += new ValeRefeicao().retornarValorValeRefeicao(diasUteisMes);}if(trabalhador.getTemValeTransporte()){
total += new ValeTransporte().retornarValorValeTransporte(diasUteisMes);}
return total;}
Depois:
public interface IBeneficios {
double retornarValorBeneficio(int diasNoMes);
}
public class ValeRefeicao implements IBeneficios {
private double vr = 12;
public double retornarValorBeneficio(int diasNoMes){return diasNoMes * vr;
}
}
public class Trabalhador {
private double salarioBase;private List<IBeneficios> listaDeBeneficios;
public Trabalhador(){listaDeBeneficios = new LinkedList<IBeneficios>();
}
public List<IBeneficios> getListaDeBeneficios() {return listaDeBeneficios;
}public void setListaDeBeneficios(List<IBeneficios> listaDeBeneficios) {
this.listaDeBeneficios = listaDeBeneficios;}
}
public class CalculadoraSalario {
Trabalhador trabalhador;private int diasUteisMes;
public void CalculadoraSalario(int dias, Trabalhador trab) {trabalhador = trab;diasUteisMes = dias;
}
public double retornaSalarioBase() {return trabalhador.getSalarioBase();
}
public double retornaTotalBeneficios(){
double total = 0;
for(IBeneficios b : trabalhador.getListaDeBeneficios()){
total += b.retornarValorBeneficio(diasUteisMes);}return total;
}}