SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

PPTX
Dip the dependency inversion principle
PDF
PDF
Função Quadratica
PPT
Função exponencial
PPTX
Light Talk sobre JavaScript Funcional
PPS
Winplot2
PPTX
Programação Orientada por Objectos - Aula 7
DOCX
Exercícios da Aula de LAB 02
Dip the dependency inversion principle
Função Quadratica
Função exponencial
Light Talk sobre JavaScript Funcional
Winplot2
Programação Orientada por Objectos - Aula 7
Exercícios da Aula de LAB 02

Mais procurados (6)

PDF
14 algoritmos de classificacao de tabelas
PDF
Talk - Meetup Elixir BH #1 - Felipe Rosa
PDF
Pós Ruy - 2 e 3 Camadas - Teste de componentes
PDF
Conhecendo ou relembrando C
PDF
Exercícios PL/SQL
PPT
3 vetor.matriz
14 algoritmos de classificacao de tabelas
Talk - Meetup Elixir BH #1 - Felipe Rosa
Pós Ruy - 2 e 3 Camadas - Teste de componentes
Conhecendo ou relembrando C
Exercícios PL/SQL
3 vetor.matriz
Anúncio

Semelhante a Dip the dependency inversion principle (20)

PPTX
Dip the dependency inversion principle
PDF
Refactoring
PDF
Tutorial java orientação a objetos parte 1
DOCX
Tutorial Java: Polimorfismo
PPT
Encapsulamento em oo
DOCX
PPTX
Construtores_Sobrecarga.pptx
PDF
05 poo-ii
PDF
Refatoração de código com Capitão Nascimento versão completa
PPT
introdução a linguagem java-2003
PPTX
Programação - linguagem C - uso de funções
DOCX
Tutorial Java: Interface
PDF
Evento Front End SP - Organizando o Javascript
PDF
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
PPTX
Programação Orientada por Objectos - Aula 2
PDF
Como conectar programas em linguagem java a bases de dados
DOCX
Exercícios java 20 02
PDF
Backbone.js
PPTX
Curso Java Básico - Aula 03
DOCX
04 modelagem classes
Dip the dependency inversion principle
Refactoring
Tutorial java orientação a objetos parte 1
Tutorial Java: Polimorfismo
Encapsulamento em oo
Construtores_Sobrecarga.pptx
05 poo-ii
Refatoração de código com Capitão Nascimento versão completa
introdução a linguagem java-2003
Programação - linguagem C - uso de funções
Tutorial Java: Interface
Evento Front End SP - Organizando o Javascript
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Programação Orientada por Objectos - Aula 2
Como conectar programas em linguagem java a bases de dados
Exercícios java 20 02
Backbone.js
Curso Java Básico - Aula 03
04 modelagem classes
Anúncio

Mais de Engenharia de Software Ágil (20)

PPTX
Sap – stablility and abstract principle
PPTX
Sap – stablility and abstract principle
PDF
Sap – stablility and abstract principle
PDF
Common closure principle
PPTX
Common closure principle
PDF
Acyclic dependencies principle
PPTX
Acyclic dependencies principle (adp)
PDF
Reuse release equivalence principle
PDF
Rep reuse release equivalence principle
PDF
OCP - The Open Close Principle - Princípio aberto/fechado
PDF
Sdp – stable dependencies principles
PDF
principio de reutilização comum
PPTX
Princípio law of demeter
PDF
Lod law of demeter
PDF
(ISP) - Interface Segregation Principle
PDF
LSP – The Liskov Substitution Principle
PDF
SRP - Single Responsability Principle
PDF
Princípio Law Of Demeter (LOD)
PPT
TDD - Test Driven Development
Sap – stablility and abstract principle
Sap – stablility and abstract principle
Sap – stablility and abstract principle
Common closure principle
Common closure principle
Acyclic dependencies principle
Acyclic dependencies principle (adp)
Reuse release equivalence principle
Rep reuse release equivalence principle
OCP - The Open Close Principle - Princípio aberto/fechado
Sdp – stable dependencies principles
principio de reutilização comum
Princípio law of demeter
Lod law of demeter
(ISP) - Interface Segregation Principle
LSP – The Liskov Substitution Principle
SRP - Single Responsability Principle
Princípio Law Of Demeter (LOD)
TDD - Test Driven Development

Último (19)

PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PPTX
Aula 18 - Manipulacao De Arquivos python
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
COBITxITIL-Entenda as diferença em uso governança TI
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Processos na gestão de transportes, TM100 Col18
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Custos e liquidação no SAP Transportation Management, TM130 Col18
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Apple Pippin Uma breve introdução. - David Glotz
Aula04-Academia Heri- Tecnologia Geral 2025
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Aula 18 - Manipulacao De Arquivos python

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