46
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

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

Embed Size (px)

DESCRIPTION

Slides da palestra apresentada no TDC 2012 na trilha de Arquitetura - A robustez é a capacidade do sistema funcionar mesmo em condições anormais. Esta palestra prentende demonstrar algumas técnicas que podem ser usadas no desenvolvimento de software com intuito de auxiliar o desenvolvedor a produzir sistemas robustos.

Citation preview

Globalcode – Open4education

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

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

while42 davidrobert [email protected]

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ãoBaixo 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 importanteem um projeto é

escrever código bonito

o mais importanteem 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 [email protected]

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