dip the dependency inversion principle

11

Click here to load reader

Upload: engenharia-de-software-agil

Post on 03-Jul-2015

760 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Dip   the dependency inversion principle

Dependency Inversion Principle

Guilherme PereiraTúlio Guimarães

Page 2: Dip   the dependency inversion principle

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.

Page 3: Dip   the dependency inversion principle

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

Page 4: Dip   the dependency inversion principle

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)

Page 5: Dip   the dependency inversion principle

Antes:

Page 6: Dip   the dependency inversion principle

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;

}

}

Page 7: Dip   the dependency inversion principle

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;}

Page 8: Dip   the dependency inversion principle

Depois:

Page 9: Dip   the dependency inversion principle

public interface IBeneficios {

double retornarValorBeneficio(int diasNoMes);

}

public class ValeRefeicao implements IBeneficios {

private double vr = 12;

public double retornarValorBeneficio(int diasNoMes){return diasNoMes * vr;

}

}

Page 10: Dip   the dependency inversion principle

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;}

}

Page 11: Dip   the dependency inversion principle

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;

}}