SlideShare ist ein Scribd-Unternehmen logo
1 von 46
Downloaden Sie, um offline zu lesen
Robustez de Software
Como ouvir menos reclamações dos seus chefes

          David Robert Camargo de Campos
            Mestre em Ciência da Computação


                                              Globalcode – Open4education
quem sou eu?




while42   davidrobert   davidrobert@gmail.com
Agenda

  (1) Lei de Murphy
  (2) Robustez de Software
  (3) Graceful Degradation
  (4) Lei de Postel
  (5) Bom Desing e Reuso
  (6) Combatendo Complexidade
  (7) Lei de Demeter
  (8) Código Legado
Como se proteger?
Mas o que isso
significa em software?
Nem sempre as premissas que
    nós (desenvolvedores)
assumimos como válidas, sempre
         serão válidas
Objeto não é null

Objeto é do tipo que eu espero

 Sistema externo está no ar

 Resposta é bem formatada

Input do usuário é conforme o
          esperado
Robustez X Precisão
         Precisão: Habilidade
         de executar as tarefas
         para as quais foi
         definido nos requisitos



         Robustez: Habilidade
         de funcionar mesmo
         em situações anormais
{
    "cliente":
    {
       "nome" : "Jonathan Bruce Postel",
       "data_nascimento" : "06 de agosto de 1943",
       "nacionalidade" : "Estadunidense",
       "profissao" : "Cientista da computação"
    }
}
public Cliente parserDeCliente() throws JSONException {


    JSONObject json = // ...
    String nome = json.getString("nome");
    String data = json.getString("data_nascimento");
    String nacionalidade = json.getString("nacionalidade");
    String naturalidade = json.getString("naturalidade");
    String profissao = json.getString("profissao");


    Cliente cliente = new Cliente(nome);
    // ...
    return cliente;
}
Faz sentido o invocador do método ter que
      conhecer a JSONException?




 Faz sentido lançar uma exceção só por
    não ter a naturalidade no JSON?
Graceful Degradation
             (Degradação Graciosa)



Permite que o sistema continue a operar adequadamente no
caso de falhas de alguns dos seus componentes

A redução de qualidade é proporcional à gravidade da falha
public Cliente parserDeCliente() throws MinhaException {
    Cliente cliente;
    try {
        JSONObject json = // ...
        cliente = new Cliente(json.getString("nome"));
    } catch (JSONException e) {
        throw new MinhaException("Faltou o nome");
    }
    // ...
    try {
        cliente.setNaturalidade(json.getString("naturalidade"));
    } catch (JSONException e) { /* ... */ }


    // ...
    return cliente;
}
"Seja conservador no que você faz, seja
liberal no que você aceita dos outros"




                           Jonh Postel
De onde vieram os
componentes?
em software
Bom Design é só Reuso?
"A função de um bom software é fazer
com que o complexo pareça ser
simples"




                        Grady Booch
ALERTA


Combatento
Complexidade
Qual nosso arsenal pra isso?



   Alta Coesão
Baixo Acoplamento
public class Financeiro {
  // ...




1 public void executarPagamentos() {
2   for (Cliente cliente: clientes) {
3     if (cliente.getCarteira().getSaldo() >= valor){
4       cliente.getCarteira().subtrai(valor);
5       // ...
6       pagantes.add(cliente);
7     }
8   }
9 }

}
public class Financeiro {
  // ...




1 public void executarPagamentos() {
2   for (Cliente cliente: clientes) {
3     if (cliente.getCarteira().getSaldo() >= valor){
4       cliente.getCarteira().subtrai(valor);
5       // ...
6       pagantes.add(cliente);
7     }
8   }
9 }

}
public class Financeiro {
  // ...




1 public void executarPagamentos() {
2   for (Cliente cliente: clientes) {
3     if (cliente.getCarteira().getSaldo() >= valor){
4       cliente.getCarteira().subtrai(valor);
5       // ...
6       pagantes.add(cliente);
7     }
8   }
9 }

}
Forte Acoplamento



   Acoplamento indesejado
   Mais responsabilidade para a classe
Lei de Demeter

É um conjunto de regras para
construir sistemas visando baixo
acoplamento

Princípio do Mínimo Conhecimento
    (Principle of Least Knowledge)
Não fale com estrageiros
Não fale com estrageiros

        ou seja

Fale somente com amigos
Não fale com estrageiros

         ou seja

Fale somente com amigos

 (membros ou parametros)
public class Cliente {
  private Carteira carteira;
  // ...

1 public boolean fazerPagamento(double valor) {
2    if (carteira.getSaldo() >= valor) {
3      carteira.subtrai(valor);
4      return true;
5    }
6    return false;
7 }

}
public class Financeiro {
  // ...

1 public void executarPagamentos() {
2   for (Cliente cliente: clientes) {
3     if (cliente.fazerPagamento(valor)) {
5        // ...
6        pagantes.add(cliente);
5     }
6   }
7 }

}
produto.getCliente().getEndereco().getCEP()
porque um acidente de trem vai estragar o seu dia
produto.getCliente().getEndereco().getCEP()
o padrão de OO no mercado é a
   “orgia dos objetos” pattern



 todo mundo pega todo mundo
É possível aplicar o princípio em
      todos os projetos?
Em algumas situações, forçar a utilização da
Lei de Demeter pode não ter valor maior do que
   manter as regras do domínio da aplicação
“A Lei de Demeter na verdade
  deveria ser chamada de Sugestão
  de Demeter”




Martin Fowler
o mais importante
   em um projeto é
escrever código bonito
o mais importante
  em um projeto é
escrever código bom
alguém tem
um método zoado ai?!
Por que ele ainda não foi
      refatorado?
O que é código legado?
“A principal coisa que identifica o código legado é a
                   falta de testes”
Obrigado!

 while42     davidrobert
 davidrobert@gmail.com
Onde saber mais?

RFC 793 - http://goo.gl/SeHUp
Artigo: Mocks Aren't Stubs - http://goo.gl/ffcLX
Video: Design de Software: As técnicas esquecidas http://goo.gl/1n42E
Wikipédia: Law of Demeter - http://goo.gl/PY8cm
Wikipédia: Fault-tolerant system - http://goo.gl/fS5PO
Livro: Working Effectively with Legacy Code - http://goo.gl/358zH
Livro: Introdução à Arquitetura e Design de Software - http://goo.gl/uECTc
Slides: Design de Código Qualidade a longo prazo - http://goo.gl/IDySH
Blog: Law Of Demeter - http://goo.gl/Ahh9D

Weitere ähnliche Inhalte

Ähnlich wie Robustez de Software - Como ouvir menos reclamações dos seus chefes

Tdc2012 david robert-robustezdesoftware
Tdc2012 david robert-robustezdesoftwareTdc2012 david robert-robustezdesoftware
Tdc2012 david robert-robustezdesoftware
Silvio Garbes
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Java
elliando dias
 

Ähnlich wie Robustez de Software - Como ouvir menos reclamações dos seus chefes (20)

Tdc2012 david robert-robustezdesoftware
Tdc2012 david robert-robustezdesoftwareTdc2012 david robert-robustezdesoftware
Tdc2012 david robert-robustezdesoftware
 
Dicas para deixar seu código mais Robusto
Dicas para deixar seu código mais RobustoDicas para deixar seu código mais Robusto
Dicas para deixar seu código mais Robusto
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDDVamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Negócio Escrito em Código
Negócio Escrito em CódigoNegócio Escrito em Código
Negócio Escrito em Código
 
Qualidade de código Android
Qualidade de código AndroidQualidade de código Android
Qualidade de código Android
 
Solid
SolidSolid
Solid
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
clean code
clean codeclean code
clean code
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Clean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPClean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHP
 
Princípio law of demeter
Princípio law of demeterPrincípio law of demeter
Princípio law of demeter
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Java
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Testes integrados automatizados
Testes integrados automatizadosTestes integrados automatizados
Testes integrados automatizados
 

Mehr von David Robert Camargo de Campos

Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
David Robert Camargo de Campos
 
Como um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenhoComo um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenho
David Robert Camargo de Campos
 

Mehr von David Robert Camargo de Campos (16)

Evolução cultural - Criando Times de Alto Desempenho
Evolução cultural - Criando Times de Alto DesempenhoEvolução cultural - Criando Times de Alto Desempenho
Evolução cultural - Criando Times de Alto Desempenho
 
Evolução cultural - Criando times de alto desempenho
Evolução cultural - Criando times de alto desempenhoEvolução cultural - Criando times de alto desempenho
Evolução cultural - Criando times de alto desempenho
 
Introdução ao kotlin
Introdução ao kotlinIntrodução ao kotlin
Introdução ao kotlin
 
O uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
O uso de PWA e o futuro do desenvolvimento mobile com React Native e KotlinO uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
O uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
 
Evolução cultural: Criando times de alto desempenho no Elo7
Evolução cultural: Criando times de alto desempenho no Elo7Evolução cultural: Criando times de alto desempenho no Elo7
Evolução cultural: Criando times de alto desempenho no Elo7
 
Cultura na engenharia & Impacto no recrutamento
Cultura na engenharia & Impacto no recrutamentoCultura na engenharia & Impacto no recrutamento
Cultura na engenharia & Impacto no recrutamento
 
Os desafios de um chat integrado ao checkout
Os desafios de um chat integrado ao checkoutOs desafios de um chat integrado ao checkout
Os desafios de um chat integrado ao checkout
 
Times de Alta Performance
Times de Alta PerformanceTimes de Alta Performance
Times de Alta Performance
 
Programando em Go
Programando em GoProgramando em Go
Programando em Go
 
An introduction to programming in Go
An introduction to programming in GoAn introduction to programming in Go
An introduction to programming in Go
 
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
 
Como um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenhoComo um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenho
 
Implementação, design ou arquitetura?
Implementação, design ou arquitetura?Implementação, design ou arquitetura?
Implementação, design ou arquitetura?
 
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando restConstruindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
 
Como um grande sistema REST funciona
Como um grande sistema REST funcionaComo um grande sistema REST funciona
Como um grande sistema REST funciona
 
Dojo abril
Dojo abrilDojo abril
Dojo abril
 

Kürzlich hochgeladen

Kürzlich hochgeladen (6)

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 

Robustez de Software - Como ouvir menos reclamações dos seus chefes

  • 1. Robustez de Software Como ouvir menos reclamações dos seus chefes David Robert Camargo de Campos Mestre em Ciência da Computação Globalcode – Open4education
  • 2. quem sou eu? while42 davidrobert davidrobert@gmail.com
  • 3. Agenda (1) Lei de Murphy (2) Robustez de Software (3) Graceful Degradation (4) Lei de Postel (5) Bom Desing e Reuso (6) Combatendo Complexidade (7) Lei de Demeter (8) Código Legado
  • 4.
  • 6.
  • 7. Mas o que isso significa em software?
  • 8. Nem sempre as premissas que nós (desenvolvedores) assumimos como válidas, sempre serão válidas
  • 9. Objeto não é null Objeto é do tipo que eu espero Sistema externo está no ar Resposta é bem formatada Input do usuário é conforme o esperado
  • 10. Robustez X Precisão Precisão: Habilidade de executar as tarefas para as quais foi definido nos requisitos Robustez: Habilidade de funcionar mesmo em situações anormais
  • 11. { "cliente": { "nome" : "Jonathan Bruce Postel", "data_nascimento" : "06 de agosto de 1943", "nacionalidade" : "Estadunidense", "profissao" : "Cientista da computação" } }
  • 12. public Cliente parserDeCliente() throws JSONException { JSONObject json = // ... String nome = json.getString("nome"); String data = json.getString("data_nascimento"); String nacionalidade = json.getString("nacionalidade"); String naturalidade = json.getString("naturalidade"); String profissao = json.getString("profissao"); Cliente cliente = new Cliente(nome); // ... return cliente; }
  • 13. Faz sentido o invocador do método ter que conhecer a JSONException? Faz sentido lançar uma exceção só por não ter a naturalidade no JSON?
  • 14. Graceful Degradation (Degradação Graciosa) Permite que o sistema continue a operar adequadamente no caso de falhas de alguns dos seus componentes A redução de qualidade é proporcional à gravidade da falha
  • 15. public Cliente parserDeCliente() throws MinhaException { Cliente cliente; try { JSONObject json = // ... cliente = new Cliente(json.getString("nome")); } catch (JSONException e) { throw new MinhaException("Faltou o nome"); } // ... try { cliente.setNaturalidade(json.getString("naturalidade")); } catch (JSONException e) { /* ... */ } // ... return cliente; }
  • 16. "Seja conservador no que você faz, seja liberal no que você aceita dos outros" Jonh Postel
  • 17. De onde vieram os componentes? em software
  • 18. Bom Design é só Reuso?
  • 19. "A função de um bom software é fazer com que o complexo pareça ser simples" Grady Booch
  • 21. Qual nosso arsenal pra isso? Alta Coesão Baixo Acoplamento
  • 22. public class Financeiro { // ... 1 public void executarPagamentos() { 2 for (Cliente cliente: clientes) { 3 if (cliente.getCarteira().getSaldo() >= valor){ 4 cliente.getCarteira().subtrai(valor); 5 // ... 6 pagantes.add(cliente); 7 } 8 } 9 } }
  • 23. public class Financeiro { // ... 1 public void executarPagamentos() { 2 for (Cliente cliente: clientes) { 3 if (cliente.getCarteira().getSaldo() >= valor){ 4 cliente.getCarteira().subtrai(valor); 5 // ... 6 pagantes.add(cliente); 7 } 8 } 9 } }
  • 24. public class Financeiro { // ... 1 public void executarPagamentos() { 2 for (Cliente cliente: clientes) { 3 if (cliente.getCarteira().getSaldo() >= valor){ 4 cliente.getCarteira().subtrai(valor); 5 // ... 6 pagantes.add(cliente); 7 } 8 } 9 } }
  • 25. Forte Acoplamento  Acoplamento indesejado  Mais responsabilidade para a classe
  • 26. Lei de Demeter É um conjunto de regras para construir sistemas visando baixo acoplamento Princípio do Mínimo Conhecimento (Principle of Least Knowledge)
  • 27. Não fale com estrageiros
  • 28. Não fale com estrageiros ou seja Fale somente com amigos
  • 29. Não fale com estrageiros ou seja Fale somente com amigos (membros ou parametros)
  • 30. public class Cliente { private Carteira carteira; // ... 1 public boolean fazerPagamento(double valor) { 2 if (carteira.getSaldo() >= valor) { 3 carteira.subtrai(valor); 4 return true; 5 } 6 return false; 7 } }
  • 31. public class Financeiro { // ... 1 public void executarPagamentos() { 2 for (Cliente cliente: clientes) { 3 if (cliente.fazerPagamento(valor)) { 5 // ... 6 pagantes.add(cliente); 5 } 6 } 7 } }
  • 33. porque um acidente de trem vai estragar o seu dia
  • 35. o padrão de OO no mercado é a “orgia dos objetos” pattern todo mundo pega todo mundo
  • 36. É possível aplicar o princípio em todos os projetos?
  • 37. Em algumas situações, forçar a utilização da Lei de Demeter pode não ter valor maior do que manter as regras do domínio da aplicação
  • 38. “A Lei de Demeter na verdade deveria ser chamada de Sugestão de Demeter” Martin Fowler
  • 39. o mais importante em um projeto é escrever código bonito
  • 40. o mais importante em um projeto é escrever código bom
  • 42. Por que ele ainda não foi refatorado?
  • 43. O que é código legado?
  • 44. “A principal coisa que identifica o código legado é a falta de testes”
  • 45. Obrigado! while42 davidrobert davidrobert@gmail.com
  • 46. Onde saber mais? RFC 793 - http://goo.gl/SeHUp Artigo: Mocks Aren't Stubs - http://goo.gl/ffcLX Video: Design de Software: As técnicas esquecidas http://goo.gl/1n42E Wikipédia: Law of Demeter - http://goo.gl/PY8cm Wikipédia: Fault-tolerant system - http://goo.gl/fS5PO Livro: Working Effectively with Legacy Code - http://goo.gl/358zH Livro: Introdução à Arquitetura e Design de Software - http://goo.gl/uECTc Slides: Design de Código Qualidade a longo prazo - http://goo.gl/IDySH Blog: Law Of Demeter - http://goo.gl/Ahh9D