56
Código Limpo Curso de Verão 2010 - IME/USP www.agilcoop.org.br Hugo Corbucci

Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

Código Limpo

Curso de Verão 2010 - IME/USPwww.agilcoop.org.br

Hugo Corbucci

Page 2: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

2Copyleft AgilCoop 2010

Introdução

A única métrica válida de qualidade de código: VSFs/min

Código bom Código ruim

Page 3: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

3Copyleft AgilCoop 2010

Introdução

“Você sabe que está trabalhando num código limpo quando cada rotina que

você lê é aquilo que você esperava que ela fosse.

Pode chamá-lo de código bonito quando o código também faz parecer que a

linguagem foi feita para o problema.”-- Ward Cunningham

Page 4: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

4Copyleft AgilCoop 2010

Introdução

Cu

sto

de

mu

dan

ças

tempo

Cu

sto

de

mu

dan

ças

tempo

Como passar de

para ?

Page 5: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

5Copyleft AgilCoop 2010

Introdução

Testes

Integração

Implementação

Projeto (design)

Page 6: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

6Copyleft AgilCoop 2010

Introdução

Page 7: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

7Copyleft AgilCoop 2010

Introdução

(refatoração)

Page 8: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

8Copyleft AgilCoop 2010

Regra dos escoteiros

“Deixe o acampamento mais limpo do que estava quando o encontrou.”

Traduzindo para software:

Sempre que ler um trecho de código, refatore algo nele para melhorá-lo (desde

que seus testes estejam todos passando).

Page 9: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

9Copyleft AgilCoop 2010

Use nomes com sentido

Page 10: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

10Copyleft AgilCoop 2010

Use nomes com sentido

Page 11: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

11Copyleft AgilCoop 2010

Use nomes com sentido

• Use nomes que revelem sua intenção– Ex:

int tempoPassadoEmDias;ao invés deint t;

Page 12: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

12Copyleft AgilCoop 2010

Use nomes com sentido

• Use nomes que revelem sua intenção• Evite desentendimentos

– Ex:int hipotenusa;ao invés deint hp;

Page 13: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

13Copyleft AgilCoop 2010

Use nomes com sentido

• Use nomes que revelem sua intenção• Evite desentendimentos• Faça distinções com significado

– Ex:int origem, destino;ao invés de:int a1, a2;

Page 14: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

14Copyleft AgilCoop 2010

Use nomes com sentido

• Use nomes que revelem sua intenção• Evite desentendimentos• Faça distinções com significado• Use nomes pronunciáveis

– Ex:int somaDosQuadradosDosCatetos;ao invés de:int sdQdC;

Page 15: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

15Copyleft AgilCoop 2010

Use nomes com sentido

• Use nomes que revelem sua intenção• Evite desentendimentos• Faça distinções com significado• Use nomes pronunciáveis• Use nomes buscáveis

– Ex:boolean oxitona;ao invés de:boolean o;

Page 16: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

16Copyleft AgilCoop 2010

Use nomes com sentido

• Use nomes que revelem sua intenção• Evite desentendimentos• Faça distinções com significado• Use nomes pronunciáveis• Use nomes buscáveis• Evite mapas mentais

– Ex: int fibonacci; ao invés de: int fbn;

Page 17: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

17Copyleft AgilCoop 2010

Use nomes com sentido

• Uma palavra por conceito– Ex:

Escolha entre apagar, remover, deletar, etc.

Page 18: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

18Copyleft AgilCoop 2010

Use nomes com sentido

• Uma palavra por conceito• Use nomes próximos do domínio da

solução ou do problema

Page 19: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

19Copyleft AgilCoop 2010

Use nomes com sentido

• Uma palavra por conceito• Use nomes próximos do domínio da

solução ou do problema• Mantenha o contexto pequeno para

manter o sentido

Page 20: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

20Copyleft AgilCoop 2010

Funções/Métodos

Page 21: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

21Copyleft AgilCoop 2010

Funções/Métodos

Page 22: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

22Copyleft AgilCoop 2010

Funções/Métodos

Page 23: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

23Copyleft AgilCoop 2010

Funções/Métodos

• Pequenas/os– C/C++/C#/Java no máximo 15 linhas

Ruby/Smalltalk/Python no máximo 5 linhas

Page 24: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

24Copyleft AgilCoop 2010

Funções/Métodos

• Pequenas/os• Faça uma coisa

– Mau cheiro: nomes de métodos com E ou OU

Page 25: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

25Copyleft AgilCoop 2010

Funções/Métodos

• Pequenas/os• Faça uma coisa• Um nível de abstração por função

– Ex:Rectangle limites = obtemLimites(shell);gc.setLineDash(new int[]{3, 2, 5});gc.drawOval(limites.x, limites.y, limites.width, limites.height);desenhaOlhos(limites);Isso é muito estranho de ler!!!!

Page 26: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

26Copyleft AgilCoop 2010

Funções/Métodos

• Pequenas/os• Faça uma coisa• Um nível de abstração por função• Argumentos

– 0, 1 ou 2. 3 raramente.Mais do que isso, provavelmente há algo errado!

Page 27: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

27Copyleft AgilCoop 2010

Funções/Métodos

• Pequenas/os• Faça uma coisa• Um nível de abstração por função• Argumentos• Sem efeitos colaterais

Ex: validaSenha não deveria inicializar uma sessão se a senha é válida!

Page 28: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

28Copyleft AgilCoop 2010

Funções/Métodos

• Pequenas/os• Faça uma coisa• Um nível de abstração por função• Argumentos• Sem efeitos colaterais• Prefira exceções a códigos de erros

Page 29: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

29Copyleft AgilCoop 2010

Funções/Métodos

• Pequenas/os• Faça uma coisa• Um nível de abstração por função• Argumentos• Sem efeitos colaterais• Prefira exceções a códigos de erros• DRY – Don't Repeat Yourself

Page 30: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

30Copyleft AgilCoop 2010

Comentários

WTF?!?

Page 31: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

31Copyleft AgilCoop 2010

Comentários

• Não resolvem problemas no código

Page 32: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

32Copyleft AgilCoop 2010

Comentários

• Não resolvem problemas no código• Explique pelo código

ou

Page 33: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

33Copyleft AgilCoop 2010

Comentários

• Não resolvem problemas no código• Explique pelo código• Bons comentários

– Ex: Legais/obrigatóriosInformativosExplicando a intençãoAvisando de consequênciasUsados por pós processamentoAmplificaçãoJavadocs p/ APIs

Page 34: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

34Copyleft AgilCoop 2010

Comentários

• Não resolvem problemas no código• Explique pelo código• Bons comentários• Comentários ruins

– Ex: Explica o que o código fazQue induzem ao erroCódigo comentadoJavadocs em código interno

Page 35: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

35Copyleft AgilCoop 2010

Formatação

Page 36: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

36Copyleft AgilCoop 2010

Formatação

• O intuito da formatação– Facilitar a leitura– Evidenciar fluxos– Agrupar códigos “próximos”

Page 37: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

37Copyleft AgilCoop 2010

Formatação

• O intuito da formatação• Formatação vertical

– Código deveria ser lido como jornal– Espaços entre conceitos– Densidade para unir– Distância vertical

Page 38: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

38Copyleft AgilCoop 2010

Formatação

• O intuito da formatação• Formatação vertical• Formatação horizontal

– Código deve caber na sua tela– Indentação!– Alinhamentos dão destaque. Pense no que

destacar antes de alinhar coisas.

Page 39: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

39Copyleft AgilCoop 2010

Formatação

• O intuito da formatação• Formatação vertical• Formatação horizontal• Regras de formatação da equipe

Page 40: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

40Copyleft AgilCoop 2010

Tratamento de erros

Page 41: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

41Copyleft AgilCoop 2010

Tratamento de erros

• Exceções ao invés de códigos de erro– Código de erro => if logo após chamada

Page 42: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

42Copyleft AgilCoop 2010

Tratamento de erros

• Exceções ao invés de códigos de erro• Use exceções não-verificadas (unchecked)

– Exceções verificadas poluem até serem tratadas

Page 43: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

43Copyleft AgilCoop 2010

Tratamento de erros

• Exceções ao invés de códigos de erro• Use exceções não verificadas• Não devolva/passe null

– Padrão NullObject

Page 44: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

44Copyleft AgilCoop 2010

No limite!

Page 45: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

45Copyleft AgilCoop 2010

No limite!

• Usando código de outros– Encapsule seu uso externo– Escreva testes para garantir comportamento

Page 46: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

46Copyleft AgilCoop 2010

No limite!

• Usando código de outros• Usando código que ainda não existe

– Use interfaces– Use testes (que falham por enquanto)

Page 47: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

47Copyleft AgilCoop 2010

No limite!

• Usando código de outros• Usando código que ainda não existe• Mantendo os limites limpos

– Atualize suas fachadas– Quando o código existir, acerte os testes

Page 48: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

48Copyleft AgilCoop 2010

Testes e TDD

Page 49: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

49Copyleft AgilCoop 2010

Testes e TDD

• 3 regras de TDD– Você não pode escrever código de produção

até escrever um teste que falha.– Você não pode escrever mais de um teste

necessário para falhar, e não compilar é falhar.

– Você não pode escrever mais código de produção do que é suficiente para passar o teste que está falhando.

Page 50: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

50Copyleft AgilCoop 2010

Testes e TDD

• 3 regras de TDD• Mantenha seus testes muito limpos

– Refatore– Use padrões– Tenha fábricas, classes para asserção, etc.– Quebre em funções– Mocks, Stubs, Spies, etc.

Page 51: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

51Copyleft AgilCoop 2010

Testes e TDD

• 3 regras de TDD• Mantenha seus testes muito limpos• Uma asserção por teste

– Se tiver mais, você não sabe o que está passando e o que não está.

Page 52: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

52Copyleft AgilCoop 2010

Testes e TDD

• 3 regras de TDD• Mantenha seus testes muito limpos• Uma asserção por teste• F.I.R.S.T.

– Fast/RápidoIndependenteRepetívelSelf-Validating/Auto-validateTimely/Em tempo

Page 53: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

53Copyleft AgilCoop 2010

Classes

• Encapsuladas/Coesas– Deveriam funcionar sem depender da

atitude de outros

Page 54: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

54Copyleft AgilCoop 2010

Classes

• Encapsuladas/Coesas• Pequenas

– Ex: Classes grandes são sinal de muita responsabilidade

Page 55: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

55Copyleft AgilCoop 2010

Perguntas

?Hugo Corbucci

[email protected]

Page 56: Lean Software Developmentagilcoop.org.br/files/AgilCoop-Verao10-CleanCode.pdf · Ruby/Smalltalk/Python no máximo 5 linhas. Copyleft AgilCoop 2010 24 Funções/Métodos • Pequenas/os

56Copyleft AgilCoop 2010

Referência