SlideShare una empresa de Scribd logo
1 de 4
Descargar para leer sin conexión
Curso: Pós Graduação em Engenharia de Software Ágil
Disciplina: Programação Orientada a Objetos - Turma: 02 Calouros
Aluno: Guilherme Pereira de Souza Alves
       Túlio Rezende de Castro Guimarães
Data: 11/06/2011       Professor: Edgard Davidson Costa Cardoso

DIP – The Dependency Inversion Principle

O 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 classes
de alto nível que encapsulam a lógica complexa e depende das classes de baixo nível. Uma
maneira natural de programar esta aplicação seria escrever as classes de baixo nível
primeiramente e depois escrever as classes de alto nível mais complexa. Como as classes de
alto nível são definidas em função das outras previamente escritas, este parece ser o caminho
ló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 de
alto nível e classes de baixo nível. Os módulos de alto nível contêm a lógica complexa que
não deve depender dos módulos de baixo nível. A camada de abstração não deve ser criada
com base em módulos de baixo nível. Os módulos é que devem ser criados com base na
camada de abstração.
De acordo com este princípio, a maneira de projetar uma estrutura de classe é começar a partir
de 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ível
Dois padrões de projeto ajudam a programar este princípio: o Template Method e o Stragety
Method. Estes dois padrões escondem as especificidades de um algoritmo tanto via herança
(Template) ou delegação via uma interface (Strategy).
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
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
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

Más contenido relacionado

La actualidad más candente

14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelasRicardo Bolanho
 
Talk - Meetup Elixir BH #1 - Felipe Rosa
Talk - Meetup Elixir BH #1 - Felipe RosaTalk - Meetup Elixir BH #1 - Felipe Rosa
Talk - Meetup Elixir BH #1 - Felipe RosaFelipe Rosa
 
Pós Ruy - 2 e 3 Camadas - Teste de componentes
Pós Ruy - 2 e 3 Camadas - Teste de componentesPós Ruy - 2 e 3 Camadas - Teste de componentes
Pós Ruy - 2 e 3 Camadas - Teste de componentesCleverson Sacramento
 
Conhecendo ou relembrando C
Conhecendo ou relembrando CConhecendo ou relembrando C
Conhecendo ou relembrando CVinícius Hax
 

La actualidad más candente (6)

14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelas
 
Talk - Meetup Elixir BH #1 - Felipe Rosa
Talk - Meetup Elixir BH #1 - Felipe RosaTalk - Meetup Elixir BH #1 - Felipe Rosa
Talk - Meetup Elixir BH #1 - Felipe Rosa
 
Pós Ruy - 2 e 3 Camadas - Teste de componentes
Pós Ruy - 2 e 3 Camadas - Teste de componentesPós Ruy - 2 e 3 Camadas - Teste de componentes
Pós Ruy - 2 e 3 Camadas - Teste de componentes
 
Conhecendo ou relembrando C
Conhecendo ou relembrando CConhecendo ou relembrando C
Conhecendo ou relembrando C
 
Exercícios PL/SQL
Exercícios PL/SQLExercícios PL/SQL
Exercícios PL/SQL
 
3 vetor.matriz
3 vetor.matriz3 vetor.matriz
3 vetor.matriz
 

Similar a Dip the dependency inversion principle

Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1Elaine Cecília Gatto
 
Construtores_Sobrecarga.pptx
Construtores_Sobrecarga.pptxConstrutores_Sobrecarga.pptx
Construtores_Sobrecarga.pptxJoberthSilva
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaEduardo Bregaida
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003elliando dias
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 
Exercícios java 20 02
Exercícios java 20   02Exercícios java 20   02
Exercícios java 20 02julyesersantos
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Natanael Fonseca
 
04 modelagem classes
04 modelagem classes04 modelagem classes
04 modelagem classesjosejunior89
 
Combatendo code smells em aplicações Java
Combatendo code smells em aplicações JavaCombatendo code smells em aplicações Java
Combatendo code smells em aplicações JavaEmmanuel Neri
 

Similar a Dip the dependency inversion principle (20)

Dip the dependency inversion principle
Dip   the dependency inversion principleDip   the dependency inversion principle
Dip the dependency inversion principle
 
Refactoring
RefactoringRefactoring
Refactoring
 
Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1Tutorial java orientação a objetos parte 1
Tutorial java orientação a objetos parte 1
 
Tutorial Java: Polimorfismo
Tutorial Java: PolimorfismoTutorial Java: Polimorfismo
Tutorial Java: Polimorfismo
 
Encapsulamento em oo
Encapsulamento em ooEncapsulamento em oo
Encapsulamento em oo
 
01 strategy
01 strategy01 strategy
01 strategy
 
Construtores_Sobrecarga.pptx
Construtores_Sobrecarga.pptxConstrutores_Sobrecarga.pptx
Construtores_Sobrecarga.pptx
 
05 poo-ii
05   poo-ii05   poo-ii
05 poo-ii
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003
 
Tutorial Java: Interface
Tutorial Java: InterfaceTutorial Java: Interface
Tutorial Java: Interface
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Exercícios java 20 02
Exercícios java 20   02Exercícios java 20   02
Exercícios java 20 02
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
 
04 modelagem classes
04 modelagem classes04 modelagem classes
04 modelagem classes
 
Combatendo code smells em aplicações Java
Combatendo code smells em aplicações JavaCombatendo code smells em aplicações Java
Combatendo code smells em aplicações Java
 

Más de Engenharia de Software Ágil

OCP - The Open Close Principle - Princípio aberto/fechado
OCP - The Open Close Principle - Princípio aberto/fechadoOCP - The Open Close Principle - Princípio aberto/fechado
OCP - The Open Close Principle - Princípio aberto/fechadoEngenharia de Software Ágil
 

Más de Engenharia de Software Ágil (20)

Sap – stablility and abstract principle
Sap – stablility and abstract principleSap – stablility and abstract principle
Sap – stablility and abstract principle
 
Sap – stablility and abstract principle
Sap – stablility and abstract principleSap – stablility and abstract principle
Sap – stablility and abstract principle
 
Sap – stablility and abstract principle
Sap – stablility and abstract principleSap – stablility and abstract principle
Sap – stablility and abstract principle
 
Common closure principle
Common closure principleCommon closure principle
Common closure principle
 
Common closure principle
Common closure principle Common closure principle
Common closure principle
 
Acyclic dependencies principle
Acyclic dependencies principleAcyclic dependencies principle
Acyclic dependencies principle
 
Acyclic dependencies principle (adp)
Acyclic dependencies principle  (adp)Acyclic dependencies principle  (adp)
Acyclic dependencies principle (adp)
 
Reuse release equivalence principle
Reuse release equivalence principleReuse release equivalence principle
Reuse release equivalence principle
 
Rep reuse release equivalence principle
Rep reuse release equivalence principleRep reuse release equivalence principle
Rep reuse release equivalence principle
 
OCP - The Open Close Principle - Princípio aberto/fechado
OCP - The Open Close Principle - Princípio aberto/fechadoOCP - The Open Close Principle - Princípio aberto/fechado
OCP - The Open Close Principle - Princípio aberto/fechado
 
Sdp – stable dependencies principles
Sdp – stable dependencies principlesSdp – stable dependencies principles
Sdp – stable dependencies principles
 
principio de reutilização comum
principio de reutilização comumprincipio de reutilização comum
principio de reutilização comum
 
Princípio law of demeter
Princípio law of demeterPrincípio law of demeter
Princípio law of demeter
 
Lod law of demeter
Lod law of demeterLod law of demeter
Lod law of demeter
 
(ISP) - Interface Segregation Principle
(ISP)  - Interface Segregation Principle(ISP)  - Interface Segregation Principle
(ISP) - Interface Segregation Principle
 
LSP – The Liskov Substitution Principle
LSP – The Liskov Substitution PrincipleLSP – The Liskov Substitution Principle
LSP – The Liskov Substitution Principle
 
SRP - Single Responsability Principle
SRP - Single Responsability PrincipleSRP - Single Responsability Principle
SRP - Single Responsability Principle
 
Princípio Law Of Demeter (LOD)
Princípio Law Of Demeter (LOD)Princípio Law Of Demeter (LOD)
Princípio Law Of Demeter (LOD)
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
FDD
FDDFDD
FDD
 

Dip the dependency inversion principle

  • 1. Curso: Pós Graduação em Engenharia de Software Ágil Disciplina: Programação Orientada a Objetos - Turma: 02 Calouros Aluno: Guilherme Pereira de Souza Alves Túlio Rezende de Castro Guimarães Data: 11/06/2011 Professor: Edgard Davidson Costa Cardoso DIP – The Dependency Inversion Principle O 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 classes de alto nível que encapsulam a lógica complexa e depende das classes de baixo nível. Uma maneira natural de programar esta aplicação seria escrever as classes de baixo nível primeiramente e depois escrever as classes de alto nível mais complexa. Como as classes de alto nível são definidas em função das outras previamente escritas, este parece ser o caminho ló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 de alto nível e classes de baixo nível. Os módulos de alto nível contêm a lógica complexa que não deve depender dos módulos de baixo nível. A camada de abstração não deve ser criada com base em módulos de baixo nível. Os módulos é que devem ser criados com base na camada de abstração. De acordo com este princípio, a maneira de projetar uma estrutura de classe é começar a partir de 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ível Dois padrões de projeto ajudam a programar este princípio: o Template Method e o Stragety Method. Estes dois padrões escondem as especificidades de um algoritmo tanto via herança (Template) ou delegação via uma interface (Strategy).
  • 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. 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. 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