SlideShare una empresa de Scribd logo
1 de 46
Descargar para leer sin conexión
Globalcode – Open4education
Robustez de Software
Como ouvir menos reclamações dos seus chefes
David Robert Camargo de Campos
Mestre em Ciência da Computação
while42 davidrobert davidrobert@gmail.com
quem sou eu?
(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
Agenda
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

Más contenido relacionado

La actualidad más candente

Lei de Demeter parte
Lei de Demeter parteLei de Demeter parte
Lei de Demeter parteJorge Oleques
 
Cucumber: um breve review
Cucumber: um breve reviewCucumber: um breve review
Cucumber: um breve reviewLaís Berlatto
 
Como o Cucumber Funciona
Como o Cucumber FuncionaComo o Cucumber Funciona
Como o Cucumber FuncionaLaís Berlatto
 
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...Joberto Diniz
 
Produtividade com ZF2, PDT & Zend Server Free Edition
Produtividade com ZF2, PDT & Zend Server Free EditionProdutividade com ZF2, PDT & Zend Server Free Edition
Produtividade com ZF2, PDT & Zend Server Free EditionFlávio Lisboa
 
O que testar abordagens de teste com ruby + rspec
O que testar abordagens de teste com ruby + rspecO que testar abordagens de teste com ruby + rspec
O que testar abordagens de teste com ruby + rspecClaudio Martins
 

La actualidad más candente (10)

Lei de Demeter parte
Lei de Demeter parteLei de Demeter parte
Lei de Demeter parte
 
Cucumber: um breve review
Cucumber: um breve reviewCucumber: um breve review
Cucumber: um breve review
 
Como o Cucumber Funciona
Como o Cucumber FuncionaComo o Cucumber Funciona
Como o Cucumber Funciona
 
Growing oos guided_by_tests entire
Growing oos guided_by_tests entireGrowing oos guided_by_tests entire
Growing oos guided_by_tests entire
 
Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014
 
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
 
Produtividade com ZF2, PDT & Zend Server Free Edition
Produtividade com ZF2, PDT & Zend Server Free EditionProdutividade com ZF2, PDT & Zend Server Free Edition
Produtividade com ZF2, PDT & Zend Server Free Edition
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
Uml
UmlUml
Uml
 
O que testar abordagens de teste com ruby + rspec
O que testar abordagens de teste com ruby + rspecO que testar abordagens de teste com ruby + rspec
O que testar abordagens de teste com ruby + rspec
 

Destacado

Search Intelligently - Liferay Symposium North America 2016, Chicago, USA
Search Intelligently - Liferay Symposium North America 2016, Chicago, USASearch Intelligently - Liferay Symposium North America 2016, Chicago, USA
Search Intelligently - Liferay Symposium North America 2016, Chicago, USAAndré Ricardo Barreto de Oliveira
 
Getting Past the 50+70=120 Calculator in Cucumber
Getting Past the 50+70=120 Calculator in CucumberGetting Past the 50+70=120 Calculator in Cucumber
Getting Past the 50+70=120 Calculator in CucumberHoward Deiner
 
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, GermanyHarnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, GermanyAndré Ricardo Barreto de Oliveira
 
Agility at Scale: Platform Versus Product Concerns - Agile Pune 2014
Agility at Scale: Platform Versus Product Concerns - Agile Pune 2014Agility at Scale: Platform Versus Product Concerns - Agile Pune 2014
Agility at Scale: Platform Versus Product Concerns - Agile Pune 2014Howard Deiner
 
'Test Data Management and Project Quality Go Hand In Hand' by Kristian Fische...
'Test Data Management and Project Quality Go Hand In Hand' by Kristian Fische...'Test Data Management and Project Quality Go Hand In Hand' by Kristian Fische...
'Test Data Management and Project Quality Go Hand In Hand' by Kristian Fische...TEST Huddle
 
Why Johnny STILL Can't Unit Test His Legacy Code - And What You Can Do About It
Why Johnny STILL Can't Unit Test His Legacy Code - And What You Can Do About ItWhy Johnny STILL Can't Unit Test His Legacy Code - And What You Can Do About It
Why Johnny STILL Can't Unit Test His Legacy Code - And What You Can Do About ItHoward Deiner
 
Howard Deiner - Agile india 2016 - How Much Unit Testing is Enough - Ask a Mu...
Howard Deiner - Agile india 2016 - How Much Unit Testing is Enough - Ask a Mu...Howard Deiner - Agile india 2016 - How Much Unit Testing is Enough - Ask a Mu...
Howard Deiner - Agile india 2016 - How Much Unit Testing is Enough - Ask a Mu...Howard Deiner
 
The Pragmatic Management of Technical Debt
The Pragmatic Management of Technical DebtThe Pragmatic Management of Technical Debt
The Pragmatic Management of Technical DebtHoward Deiner
 
Padrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a ObjetosPadrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a ObjetosFabio Kon
 
Smart Cities: Concepts, Platforms, and Challenges
Smart Cities: Concepts, Platforms, and Challenges Smart Cities: Concepts, Platforms, and Challenges
Smart Cities: Concepts, Platforms, and Challenges Fabio Kon
 
The Manifesto for Software Craftsmanship – Because Post-Its and Legos Don’t C...
The Manifesto for Software Craftsmanship – Because Post-Its and Legos Don’t C...The Manifesto for Software Craftsmanship – Because Post-Its and Legos Don’t C...
The Manifesto for Software Craftsmanship – Because Post-Its and Legos Don’t C...Howard Deiner
 
Como [não] falhar na sua startup
Como [não] falhar na sua startup Como [não] falhar na sua startup
Como [não] falhar na sua startup Fabio Kon
 
Cidades Inteligentes: Interdisciplinaridade, Software Livre, Dados Abertos e ...
Cidades Inteligentes: Interdisciplinaridade, Software Livre, Dados Abertos e ...Cidades Inteligentes: Interdisciplinaridade, Software Livre, Dados Abertos e ...
Cidades Inteligentes: Interdisciplinaridade, Software Livre, Dados Abertos e ...Fabio Kon
 
Inovação Aberta, Ecossistemas de Startups e sua Evolução
Inovação Aberta, Ecossistemas de Startups e sua EvoluçãoInovação Aberta, Ecossistemas de Startups e sua Evolução
Inovação Aberta, Ecossistemas de Startups e sua EvoluçãoFabio Kon
 
TDD for the Newb Who Wants to Become an Apprentice
TDD for the Newb Who Wants to Become an ApprenticeTDD for the Newb Who Wants to Become an Apprentice
TDD for the Newb Who Wants to Become an ApprenticeHoward Deiner
 
Como Ensinar Engenharia de Software sem que seus alunos durmam
Como Ensinar Engenharia de Software sem que seus alunos durmamComo Ensinar Engenharia de Software sem que seus alunos durmam
Como Ensinar Engenharia de Software sem que seus alunos durmamFabio Kon
 
Why Johnny Can't Unit Test His Legacy Code - And What You Can Do About It
Why Johnny Can't Unit Test His Legacy Code - And What You Can Do About ItWhy Johnny Can't Unit Test His Legacy Code - And What You Can Do About It
Why Johnny Can't Unit Test His Legacy Code - And What You Can Do About ItHoward Deiner
 
Agile .NET Development with BDD and Continuous Integration
Agile .NET Development with BDD and Continuous IntegrationAgile .NET Development with BDD and Continuous Integration
Agile .NET Development with BDD and Continuous IntegrationTung Nguyen Thanh
 
Continuous Delivery with VS2015 and TFS2015
Continuous Delivery with VS2015 and TFS2015Continuous Delivery with VS2015 and TFS2015
Continuous Delivery with VS2015 and TFS2015Tung Nguyen Thanh
 

Destacado (20)

Search Intelligently - Liferay Symposium North America 2016, Chicago, USA
Search Intelligently - Liferay Symposium North America 2016, Chicago, USASearch Intelligently - Liferay Symposium North America 2016, Chicago, USA
Search Intelligently - Liferay Symposium North America 2016, Chicago, USA
 
Getting Past the 50+70=120 Calculator in Cucumber
Getting Past the 50+70=120 Calculator in CucumberGetting Past the 50+70=120 Calculator in Cucumber
Getting Past the 50+70=120 Calculator in Cucumber
 
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, GermanyHarnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
 
Agility at Scale: Platform Versus Product Concerns - Agile Pune 2014
Agility at Scale: Platform Versus Product Concerns - Agile Pune 2014Agility at Scale: Platform Versus Product Concerns - Agile Pune 2014
Agility at Scale: Platform Versus Product Concerns - Agile Pune 2014
 
'Test Data Management and Project Quality Go Hand In Hand' by Kristian Fische...
'Test Data Management and Project Quality Go Hand In Hand' by Kristian Fische...'Test Data Management and Project Quality Go Hand In Hand' by Kristian Fische...
'Test Data Management and Project Quality Go Hand In Hand' by Kristian Fische...
 
Why Johnny STILL Can't Unit Test His Legacy Code - And What You Can Do About It
Why Johnny STILL Can't Unit Test His Legacy Code - And What You Can Do About ItWhy Johnny STILL Can't Unit Test His Legacy Code - And What You Can Do About It
Why Johnny STILL Can't Unit Test His Legacy Code - And What You Can Do About It
 
Howard Deiner - Agile india 2016 - How Much Unit Testing is Enough - Ask a Mu...
Howard Deiner - Agile india 2016 - How Much Unit Testing is Enough - Ask a Mu...Howard Deiner - Agile india 2016 - How Much Unit Testing is Enough - Ask a Mu...
Howard Deiner - Agile india 2016 - How Much Unit Testing is Enough - Ask a Mu...
 
The Pragmatic Management of Technical Debt
The Pragmatic Management of Technical DebtThe Pragmatic Management of Technical Debt
The Pragmatic Management of Technical Debt
 
Padrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a ObjetosPadrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a Objetos
 
Smart Cities: Concepts, Platforms, and Challenges
Smart Cities: Concepts, Platforms, and Challenges Smart Cities: Concepts, Platforms, and Challenges
Smart Cities: Concepts, Platforms, and Challenges
 
The Manifesto for Software Craftsmanship – Because Post-Its and Legos Don’t C...
The Manifesto for Software Craftsmanship – Because Post-Its and Legos Don’t C...The Manifesto for Software Craftsmanship – Because Post-Its and Legos Don’t C...
The Manifesto for Software Craftsmanship – Because Post-Its and Legos Don’t C...
 
Como [não] falhar na sua startup
Como [não] falhar na sua startup Como [não] falhar na sua startup
Como [não] falhar na sua startup
 
Cidades Inteligentes: Interdisciplinaridade, Software Livre, Dados Abertos e ...
Cidades Inteligentes: Interdisciplinaridade, Software Livre, Dados Abertos e ...Cidades Inteligentes: Interdisciplinaridade, Software Livre, Dados Abertos e ...
Cidades Inteligentes: Interdisciplinaridade, Software Livre, Dados Abertos e ...
 
Inovação Aberta, Ecossistemas de Startups e sua Evolução
Inovação Aberta, Ecossistemas de Startups e sua EvoluçãoInovação Aberta, Ecossistemas de Startups e sua Evolução
Inovação Aberta, Ecossistemas de Startups e sua Evolução
 
TDD for the Newb Who Wants to Become an Apprentice
TDD for the Newb Who Wants to Become an ApprenticeTDD for the Newb Who Wants to Become an Apprentice
TDD for the Newb Who Wants to Become an Apprentice
 
Como Ensinar Engenharia de Software sem que seus alunos durmam
Como Ensinar Engenharia de Software sem que seus alunos durmamComo Ensinar Engenharia de Software sem que seus alunos durmam
Como Ensinar Engenharia de Software sem que seus alunos durmam
 
Why Johnny Can't Unit Test His Legacy Code - And What You Can Do About It
Why Johnny Can't Unit Test His Legacy Code - And What You Can Do About ItWhy Johnny Can't Unit Test His Legacy Code - And What You Can Do About It
Why Johnny Can't Unit Test His Legacy Code - And What You Can Do About It
 
Agile .NET Development with BDD and Continuous Integration
Agile .NET Development with BDD and Continuous IntegrationAgile .NET Development with BDD and Continuous Integration
Agile .NET Development with BDD and Continuous Integration
 
Continuous Delivery with VS2015 and TFS2015
Continuous Delivery with VS2015 and TFS2015Continuous Delivery with VS2015 and TFS2015
Continuous Delivery with VS2015 and TFS2015
 
Docker for .net developer
Docker for .net developerDocker for .net developer
Docker for .net developer
 

Similar a Tdc2012 david robert-robustezdesoftware

Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
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 TDDDomingos Teruel
 
Negócio Escrito em Código
Negócio Escrito em CódigoNegócio Escrito em Código
Negócio Escrito em CódigoDouglas Siviotti
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Clean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de SoftwareClean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de SoftwareGabriel Felipe Soares
 
TDC2018SP | Trilha Mobile - Learn once, code anywhere
TDC2018SP | Trilha Mobile - Learn once, code anywhereTDC2018SP | Trilha Mobile - Learn once, code anywhere
TDC2018SP | Trilha Mobile - Learn once, code anywheretdc-globalcode
 
Dojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarDojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarLuiz Ribeiro
 
Pattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptPattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptGustavo Corrêa Alves
 

Similar a Tdc2012 david robert-robustezdesoftware (20)

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
 
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
 
Negócio Escrito em Código
Negócio Escrito em CódigoNegócio Escrito em Código
Negócio Escrito em Código
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
clean code
clean codeclean code
clean code
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Clean Code na Prática
Clean Code na PráticaClean Code na Prática
Clean Code na Prática
 
Clean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de SoftwareClean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de Software
 
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
 
TCC - Código Limpo
TCC - Código LimpoTCC - Código Limpo
TCC - Código Limpo
 
TDC2018SP | Trilha Mobile - Learn once, code anywhere
TDC2018SP | Trilha Mobile - Learn once, code anywhereTDC2018SP | Trilha Mobile - Learn once, code anywhere
TDC2018SP | Trilha Mobile - Learn once, code anywhere
 
Meetup MUG-RS KingHost
Meetup MUG-RS KingHostMeetup MUG-RS KingHost
Meetup MUG-RS KingHost
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Dojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarDojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCar
 
Introdução ao C#
Introdução ao C#Introdução ao C#
Introdução ao C#
 
Pattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptPattners Everywhere, Even in Javascript
Pattners Everywhere, Even in Javascript
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
 

Tdc2012 david robert-robustezdesoftware

  • 1. Globalcode – Open4education Robustez de Software Como ouvir menos reclamações dos seus chefes David Robert Camargo de Campos Mestre em Ciência da Computação
  • 3. (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 Agenda
  • 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”
  • 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