SlideShare uma empresa Scribd logo
1 de 3
Baixar para ler offline
Engenharia de software centrada em métodos ágeis – Turma 2

Disciplina: Programação Orientado a Objeto
Professor: Edgar Davidson                           Data: 15/06/2011
Grupo:      Gladson Otavio
            Emerson Roger
                     Princípio Law Of Demeter (LOD)
                                  Lei de demeter

       Princípio

              A lei de Demeter é um conjunto de regras para construir sistemas
       visando baixo acoplamento, também conhecida como Princípio do menor
       Conhecimento e fale somente com os amigos.

       Aspecto Gerais

      •   Cada unidade deveria somente utilizar um conjunto limitado de unidades de
          outras unidades.
      •   Cada unidade deveria falar somente com seus amigos e não com
          estrangeiros.

       Em orientação a objeto

       Um método M de um objeto O somente poderia acessar métodos de outros
       objetos que sigam as diretrizes:
               Seja parâmetro de M
               Um objeto que M criou
               Um método do próprio objeto O
               Objeto diretamente relacionado com o objeto O
               Uma variável global acessível pelo objeto O

Infringindo o princípio

Analisando o diagrama de        classe abaixo, temos três classes que mantem
relacionamentos entre si, mas a clsse jornaleiro mantem dependência indesejada com
a classe carteira, causado pelo método coletarPagamento, quebrando o principio de
lod.

public void coletarPagamento(){
      for (Cliente cliente : clientes) {
          if (cliente.getMinhacarteira().getValor()>= nota) {
        cliente.getMinhacarteira().subtractValor(nota);
              fundoColeta += nota;
          }
          else {
               System.out.println("Sem dinheiro");
            }
      }
}
A finalidade do método coletar pagamento, é coletar pagamento dos clientes por
produtos ou serviços oferecido pela classe jornaleiro,mas perceba que dentro do
método, a classe jornaleiro acessa a classe carteira que mantem associação apenas
com cliente,passando a conhecer tudo que tem na carteira do cliente, ou seja na
classe carteira, coisa que somente o cliente deve saber. Analise o diagrama abaixo e
perceba o forte acoplamento criado,pois foi criado uma depenência com aclasse
carteira.




       Solução

       1º Para resolver este problema, temos que remover o método
       getMinhacarteira() da classe cliente e criar um método getfazerPagamento,
       agora o cliente recebe a nota e faz o pagamento para o jornaleiro, cenário que
       acontence no mundo real. Vamos verificar o código criado.

public double getFazerPagamento(double nota) {
             double valorPago = 0
          if (minhacarteira.getValor() >= nota) {
              minhacarteira.subtractValor(nota);
              valorPago = nota;
          }
          return valorPago;
}

        2º Agora, também é preciso modificar o método coletarPagamento() da classe
jornaleiro, pois ele não acessa mais a classe carteira para retirar a pagamento que lhe
é devido.Vamos analisar a modificação feita na método:
public void coletarPagamento(){
   for (Cliente cliente : clientes) {
       double pagamento = cliente.getFazerPagamento(nota);
       if (pagamento !=0) {
           fundoColeta += pagamento;
        }
   }
}

Perceba que agora, dentro do método há uma variável pagamento que recebe o
método fazerPagamento(nota) da classe cliente, desta maneira o jornaleiro sequer tem
conhecimento das informções da classe carteira, alias ele nem precisa saber se o
cliente tem uma carteira.



Agora atende ao principio (lod) lei de demeter,veja que a dependência da classe
jornaleiro com a classe carteira foi removida




       Conclusão

       Este princípio é muito importante para manter baixo acoplamento entre as
       classes, mas é preciso arquitetar bem o projeto para que não seja criado muitos
       métodos na classe, causando uma baixa coesão . Este princípio não é aplicado a
       todos os projetos, pois haverão casos onde a regra de negócio exige que várias
       classes precisam conhecer outras calsses.

Mais conteúdo relacionado

Mais procurados

15 padrões de mensageria para integração de sistemas
15 padrões de mensageria para integração de sistemas15 padrões de mensageria para integração de sistemas
15 padrões de mensageria para integração de sistemasHelder da Rocha
 
Conceitos básicos de programação orientada a objetos
Conceitos básicos de programação orientada a objetosConceitos básicos de programação orientada a objetos
Conceitos básicos de programação orientada a objetosLeonardo Melo Santos
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 
Laravel - The PHP Framework for Web Artisans
Laravel - The PHP Framework for Web ArtisansLaravel - The PHP Framework for Web Artisans
Laravel - The PHP Framework for Web ArtisansWindzoon Technologies
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introduçãoJosino Rodrigues
 
The Enterprise Case for Node.js
The Enterprise Case for Node.jsThe Enterprise Case for Node.js
The Enterprise Case for Node.jsNodejsFoundation
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Aula 1. apresentação + frameworks
Aula 1. apresentação + frameworksAula 1. apresentação + frameworks
Aula 1. apresentação + frameworksandreluizlc
 
13 Java Script - Validação de formulário
13 Java Script  - Validação de formulário13 Java Script  - Validação de formulário
13 Java Script - Validação de formulárioCentro Paula Souza
 
Directives in asp.net
Directives in asp.netDirectives in asp.net
Directives in asp.netSireesh K
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web APIhabib_786
 
Introdução básica ao JavaScript
Introdução básica ao JavaScriptIntrodução básica ao JavaScript
Introdução básica ao JavaScriptCarlos Eduardo Kadu
 
Node js Modules and Event Emitters
Node js Modules and Event EmittersNode js Modules and Event Emitters
Node js Modules and Event EmittersTheCreativedev Blog
 
02 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.502 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.5César Augusto Pessôa
 
JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosEduardo Mendes
 
JSP Components and Directives.pdf
JSP Components and Directives.pdfJSP Components and Directives.pdf
JSP Components and Directives.pdfArumugam90
 

Mais procurados (20)

Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
15 padrões de mensageria para integração de sistemas
15 padrões de mensageria para integração de sistemas15 padrões de mensageria para integração de sistemas
15 padrões de mensageria para integração de sistemas
 
Conceitos básicos de programação orientada a objetos
Conceitos básicos de programação orientada a objetosConceitos básicos de programação orientada a objetos
Conceitos básicos de programação orientada a objetos
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
Laravel - The PHP Framework for Web Artisans
Laravel - The PHP Framework for Web ArtisansLaravel - The PHP Framework for Web Artisans
Laravel - The PHP Framework for Web Artisans
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introdução
 
The Enterprise Case for Node.js
The Enterprise Case for Node.jsThe Enterprise Case for Node.js
The Enterprise Case for Node.js
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Aula 1. apresentação + frameworks
Aula 1. apresentação + frameworksAula 1. apresentação + frameworks
Aula 1. apresentação + frameworks
 
13 Java Script - Validação de formulário
13 Java Script  - Validação de formulário13 Java Script  - Validação de formulário
13 Java Script - Validação de formulário
 
Directives in asp.net
Directives in asp.netDirectives in asp.net
Directives in asp.net
 
PHP - Introdução
PHP - IntroduçãoPHP - Introdução
PHP - Introdução
 
Integrando Python e JavaScript
Integrando Python e JavaScriptIntegrando Python e JavaScript
Integrando Python e JavaScript
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
 
Introdução básica ao JavaScript
Introdução básica ao JavaScriptIntrodução básica ao JavaScript
Introdução básica ao JavaScript
 
Encapsulamento em oo
Encapsulamento em ooEncapsulamento em oo
Encapsulamento em oo
 
Node js Modules and Event Emitters
Node js Modules and Event EmittersNode js Modules and Event Emitters
Node js Modules and Event Emitters
 
02 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.502 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.5
 
JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a Objetos
 
JSP Components and Directives.pdf
JSP Components and Directives.pdfJSP Components and Directives.pdf
JSP Components and Directives.pdf
 

Semelhante a Engenharia de Software Centrada em Métodos Ágeis

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
 
Java 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseJava 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseRegis Magalhães
 
As vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projetoAs vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projetoGabriel Galdino
 
POO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosPOO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosLudimila Monjardim Casagrande
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - IFabio Moura Pereira
 
Uma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosUma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosGabriel Schade Cardoso
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasRafael Chinelato Del Nero
 
ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#biandamakengo08
 
Heranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismoHeranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismoPedro Neto
 

Semelhante a Engenharia de Software Centrada em Métodos Ágeis (20)

Grasp Patterns.ppt
Grasp Patterns.pptGrasp Patterns.ppt
Grasp Patterns.ppt
 
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: Herança
Tutorial Java: HerançaTutorial Java: Herança
Tutorial Java: Herança
 
Java 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseJava 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De Classe
 
Tutorial Java: Interface
Tutorial Java: InterfaceTutorial Java: Interface
Tutorial Java: Interface
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
As vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projetoAs vantagens e desvantagens da aplicação de padrões de projeto
As vantagens e desvantagens da aplicação de padrões de projeto
 
Tutorial Java: Polimorfismo
Tutorial Java: PolimorfismoTutorial Java: Polimorfismo
Tutorial Java: Polimorfismo
 
POO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosPOO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a Objetos
 
POO.pdf
POO.pdfPOO.pdf
POO.pdf
 
01 strategy
01 strategy01 strategy
01 strategy
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 
Aula1
Aula1Aula1
Aula1
 
Uma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosUma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de erros
 
Mvc delphi
Mvc delphiMvc delphi
Mvc delphi
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivas
 
Classes e Objectos JAVA
Classes e Objectos JAVAClasses e Objectos JAVA
Classes e Objectos JAVA
 
ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#ebook-completo c# o melhor para começar no c#
ebook-completo c# o melhor para começar no c#
 
Heranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismoHeranca reescrita e_polimorfismo
Heranca reescrita e_polimorfismo
 

Mais 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
 

Mais 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
 
Lod law of demeter
Lod law of demeterLod law of demeter
Lod law of demeter
 
Dip the dependency inversion principle
Dip   the dependency inversion principleDip   the dependency inversion principle
Dip the dependency inversion principle
 
Dip the dependency inversion principle
Dip   the dependency inversion principleDip   the dependency inversion principle
Dip the dependency inversion principle
 
Dip the dependency inversion principle
Dip   the dependency inversion principleDip   the dependency inversion principle
Dip the dependency inversion principle
 
(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
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 

Engenharia de Software Centrada em Métodos Ágeis

  • 1. Engenharia de software centrada em métodos ágeis – Turma 2 Disciplina: Programação Orientado a Objeto Professor: Edgar Davidson Data: 15/06/2011 Grupo: Gladson Otavio Emerson Roger Princípio Law Of Demeter (LOD) Lei de demeter Princípio A lei de Demeter é um conjunto de regras para construir sistemas visando baixo acoplamento, também conhecida como Princípio do menor Conhecimento e fale somente com os amigos. Aspecto Gerais • Cada unidade deveria somente utilizar um conjunto limitado de unidades de outras unidades. • Cada unidade deveria falar somente com seus amigos e não com estrangeiros. Em orientação a objeto Um método M de um objeto O somente poderia acessar métodos de outros objetos que sigam as diretrizes: Seja parâmetro de M Um objeto que M criou Um método do próprio objeto O Objeto diretamente relacionado com o objeto O Uma variável global acessível pelo objeto O Infringindo o princípio Analisando o diagrama de classe abaixo, temos três classes que mantem relacionamentos entre si, mas a clsse jornaleiro mantem dependência indesejada com a classe carteira, causado pelo método coletarPagamento, quebrando o principio de lod. public void coletarPagamento(){ for (Cliente cliente : clientes) { if (cliente.getMinhacarteira().getValor()>= nota) { cliente.getMinhacarteira().subtractValor(nota); fundoColeta += nota; } else { System.out.println("Sem dinheiro"); } } }
  • 2. A finalidade do método coletar pagamento, é coletar pagamento dos clientes por produtos ou serviços oferecido pela classe jornaleiro,mas perceba que dentro do método, a classe jornaleiro acessa a classe carteira que mantem associação apenas com cliente,passando a conhecer tudo que tem na carteira do cliente, ou seja na classe carteira, coisa que somente o cliente deve saber. Analise o diagrama abaixo e perceba o forte acoplamento criado,pois foi criado uma depenência com aclasse carteira. Solução 1º Para resolver este problema, temos que remover o método getMinhacarteira() da classe cliente e criar um método getfazerPagamento, agora o cliente recebe a nota e faz o pagamento para o jornaleiro, cenário que acontence no mundo real. Vamos verificar o código criado. public double getFazerPagamento(double nota) { double valorPago = 0 if (minhacarteira.getValor() >= nota) { minhacarteira.subtractValor(nota); valorPago = nota; } return valorPago; } 2º Agora, também é preciso modificar o método coletarPagamento() da classe jornaleiro, pois ele não acessa mais a classe carteira para retirar a pagamento que lhe é devido.Vamos analisar a modificação feita na método:
  • 3. public void coletarPagamento(){ for (Cliente cliente : clientes) { double pagamento = cliente.getFazerPagamento(nota); if (pagamento !=0) { fundoColeta += pagamento; } } } Perceba que agora, dentro do método há uma variável pagamento que recebe o método fazerPagamento(nota) da classe cliente, desta maneira o jornaleiro sequer tem conhecimento das informções da classe carteira, alias ele nem precisa saber se o cliente tem uma carteira. Agora atende ao principio (lod) lei de demeter,veja que a dependência da classe jornaleiro com a classe carteira foi removida Conclusão Este princípio é muito importante para manter baixo acoplamento entre as classes, mas é preciso arquitetar bem o projeto para que não seja criado muitos métodos na classe, causando uma baixa coesão . Este princípio não é aplicado a todos os projetos, pois haverão casos onde a regra de negócio exige que várias classes precisam conhecer outras calsses.