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.

Lod law of demeter

  • 1.
    Engenharia de softwarecentrada 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 domé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.