Download - Tdc2012 david robert-robustezdesoftware

Transcript
Page 1: Tdc2012 david robert-robustezdesoftware

Globalcode – Open4education

Robustez de SoftwareComo ouvir menos reclamações dos seus chefes

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

Page 2: Tdc2012 david robert-robustezdesoftware

while42 davidrobert [email protected]

quem sou eu?

Page 3: Tdc2012 david robert-robustezdesoftware

(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

Page 4: Tdc2012 david robert-robustezdesoftware
Page 5: Tdc2012 david robert-robustezdesoftware

Como se proteger?

Page 6: Tdc2012 david robert-robustezdesoftware
Page 7: Tdc2012 david robert-robustezdesoftware

Mas o que isso significa em software?

Page 8: Tdc2012 david robert-robustezdesoftware

Nem sempre as premissas que nós (desenvolvedores)

assumimos como válidas, sempre serão válidas

Page 9: Tdc2012 david robert-robustezdesoftware

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

Page 10: Tdc2012 david robert-robustezdesoftware

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

Page 11: Tdc2012 david robert-robustezdesoftware

{ "cliente": { "nome" : "Jonathan Bruce Postel", "data_nascimento" : "06 de agosto de 1943", "nacionalidade" : "Estadunidense", "profissao" : "Cientista da computação" }}

Page 12: Tdc2012 david robert-robustezdesoftware

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;

}

Page 13: Tdc2012 david robert-robustezdesoftware

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?

Page 14: Tdc2012 david robert-robustezdesoftware

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

Page 15: Tdc2012 david robert-robustezdesoftware

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;}

Page 16: Tdc2012 david robert-robustezdesoftware

"Seja conservador no que você faz, seja liberal no que você aceita dos outros"

Jonh Postel

Page 17: Tdc2012 david robert-robustezdesoftware

De onde vieram os componentes? em software

Page 18: Tdc2012 david robert-robustezdesoftware

Bom Design é só Reuso?

Page 19: Tdc2012 david robert-robustezdesoftware

"A função de um bom software é fazer com que o complexo pareça ser simples"

Grady Booch

Page 20: Tdc2012 david robert-robustezdesoftware

ALERTA

Combatento Complexidade

Page 21: Tdc2012 david robert-robustezdesoftware

Qual nosso arsenal pra isso?

Alta CoesãoBaixo Acoplamento

Page 22: Tdc2012 david robert-robustezdesoftware

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 }

}

Page 23: Tdc2012 david robert-robustezdesoftware

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 }

}

Page 24: Tdc2012 david robert-robustezdesoftware

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 }

}

Page 25: Tdc2012 david robert-robustezdesoftware

Forte Acoplamento

Acoplamento indesejado Mais responsabilidade para a classe

Page 26: Tdc2012 david robert-robustezdesoftware

Lei de Demeter

É um conjunto de regras para construir sistemas visando baixo acoplamento

Princípio do Mínimo Conhecimento

(Principle of Least Knowledge)

Page 27: Tdc2012 david robert-robustezdesoftware

Não fale com estrageiros

Page 28: Tdc2012 david robert-robustezdesoftware

Não fale com estrageiros

ou seja

Fale somente com amigos

Page 29: Tdc2012 david robert-robustezdesoftware

Não fale com estrageiros

ou seja

Fale somente com amigos

(membros ou parametros)

Page 30: Tdc2012 david robert-robustezdesoftware

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 }

}

Page 31: Tdc2012 david robert-robustezdesoftware

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 }

}

Page 32: Tdc2012 david robert-robustezdesoftware

produto.getCliente().getEndereco().getCEP()

Page 33: Tdc2012 david robert-robustezdesoftware

porque um acidente de trem vai estragar o seu dia

Page 34: Tdc2012 david robert-robustezdesoftware

produto.getCliente().getEndereco().getCEP()

Page 35: Tdc2012 david robert-robustezdesoftware

o padrão de OO no mercado é a “orgia dos objetos” pattern

todo mundo pega todo mundo

Page 36: Tdc2012 david robert-robustezdesoftware

É possível aplicar o princípio em todos os projetos?

Page 37: Tdc2012 david robert-robustezdesoftware

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

Page 38: Tdc2012 david robert-robustezdesoftware

“A Lei de Demeter na verdade deveria ser chamada de Sugestão de Demeter”

Martin Fowler

Page 39: Tdc2012 david robert-robustezdesoftware

o mais importanteem um projeto é

escrever código bonito

Page 40: Tdc2012 david robert-robustezdesoftware

o mais importanteem um projeto é

escrever código bom

Page 41: Tdc2012 david robert-robustezdesoftware

alguém tem um método zoado ai?!

Page 42: Tdc2012 david robert-robustezdesoftware

Por que ele ainda não foi refatorado?

Page 43: Tdc2012 david robert-robustezdesoftware

O que é código legado?

Page 44: Tdc2012 david robert-robustezdesoftware

“A principal coisa que identifica o código legado é a falta de testes”

Page 45: Tdc2012 david robert-robustezdesoftware

Obrigado!

while42 davidrobert [email protected]

Page 46: Tdc2012 david robert-robustezdesoftware

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