Curso: Pós Graduação em Engenharia de Software ÁgilDisciplina: Programação Orientada a Objetos - Turma: 02 CalourosAluno: ...
Diagrama UML com dependência.public class Trabalhador {    private Boolean temValeTransporte;    private Boolean temValeRe...
public double retornarSalarioBase(){        return trabalhador.getSalarioBase();    }    public double retornarSomaBenefic...
private double vr = 12;    public double retornarValorBeneficio(int diasNoMes){        return diasNoMes * vr;    }}public ...
Upcoming SlideShare
Loading in …5
×

Dip the dependency inversion principle

696 views

Published on

Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações; e
Abstrações não devem depender de detalhes. Os detalhes é que devem depender das abstrações.

Published in: Technology, Travel
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
696
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Dip the dependency inversion principle

  1. 1. Curso: Pós Graduação em Engenharia de Software ÁgilDisciplina: Programação Orientada a Objetos - Turma: 02 CalourosAluno: Guilherme Pereira de Souza Alves Túlio Rezende de Castro GuimarãesData: 11/06/2011 Professor: Edgard Davidson Costa CardosoDIP – The Dependency Inversion PrincipleO Princípio da Inversão de Dependência estabelece duas definições: 1. Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações; e 2. Abstrações não devem depender de detalhes. Os detalhes é que devem depender das abstrações.Em uma aplicação temos classes de baixo nível que programam operações básicas e classesde alto nível que encapsulam a lógica complexa e depende das classes de baixo nível. Umamaneira natural de programar esta aplicação seria escrever as classes de baixo nívelprimeiramente e depois escrever as classes de alto nível mais complexa. Como as classes dealto nível são definidas em função das outras previamente escritas, este parece ser o caminhológico para fazer esta programação. Porém, este não é um bom design, deixa o código rígido,frágil e imóvel.Para evitar tais problemas, podemos introduzir uma camada de abstração entre as classes dealto nível e classes de baixo nível. Os módulos de alto nível contêm a lógica complexa quenão deve depender dos módulos de baixo nível. A camada de abstração não deve ser criadacom base em módulos de baixo nível. Os módulos é que devem ser criados com base nacamada de abstração.De acordo com este princípio, a maneira de projetar uma estrutura de classe é começar a partirde módulos de alto nível para os módulos de baixo nível:Classes de Alto Nível -> Camada de Abstração -> Classes de Baixo NívelDois padrões de projeto ajudam a programar este princípio: o Template Method e o StragetyMethod. Estes dois padrões escondem as especificidades de um algoritmo tanto via herança(Template) ou delegação via uma interface (Strategy).
  2. 2. Diagrama UML com dependência.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; } Página 2 de 4
  3. 3. 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; }} Diagrama UML com aplicação do Princípio da Inversão de Dependência.public interface IBeneficios { double retornarValorBeneficio(int diasNoMes);}public class ValeRefeicao implements IBeneficios { Página 3 de 4
  4. 4. 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; }} Página 4 de 4

×