Post on 25-Jun-2015
description
Globalcode – Open4education
Robustez de SoftwareComo ouvir menos reclamações dos seus chefes
David Robert Camargo de CamposMestre em Ciência da Computação
(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
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;}
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 }
}
Lei de Demeter
É um conjunto de regras para construir sistemas visando baixo acoplamento
Princípio do Mínimo Conhecimento
(Principle of Least Knowledge)
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 }
}
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
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