dip the dependency inversion principle

Post on 03-Jul-2015

760 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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;

}}

top related