CLEAN CODE
Robert C. Martin
Renato Chencinski - 09/04/2014
renato@inspira.com.br
1) O QUE É CÓDIGO LIMPO
- Michael Feathers - Clean code always looks like it was written by
someone who cares.
- Ron Jeffr...
1) O QUE É CÓDIGO LIMPO
- Ward Cunningham - Each routine you read is pretty much what you
expected
1) O QUE É CÓDIGO LIMPO
Paradigma: Razão de tempo lendo código vs escrevendo: > 10:1
- Fazer software fácil de ler é fazer...
COMO MEDIR SE CÓDIGO É LIMPO?
COMENTÁRIOS
Comentário desatualizado
/**
* Always returns true.
*/
public boolean isAvailable() {
return false;
}
//privat...
COMENTÁRIOS
Comentário inusitado
// somedev1 - 6/7/02 Adding temporary tracking of Login screen
// somedev2 - 5/22/07 Temp...
COMENTÁRIOS
Comentários úteis
return 1; # returns 1
i++; // increase i by 1
FÁCIL LEITURA E ENTENDIMENTO
GlobalConfiguration.Configuration.Filters.Add(new
HandleAndLogErrorAttribute());
ViewEngines....
FÁCIL LEITURA E ENTENDIMENTO
GlobalConfiguration.Configuration.Filters.Add(new
HandleAndLogErrorAttribute());
ViewEngines....
FÁCIL LEITURA E ENTENDIMENTO
public static KeyValuePair<string, ViewTema>
FindDominio(Dictionary<string, ViewTema> dominio...
FÁCIL LEITURA E ENTENDIMENTO
[Código de função gigante]
2) NOMES SIGNIFICATIVOS
- Revelam intenção
- int elapsedTimeInDays
- Usar constantes para explicar valores
- cell[0] -> ce...
2) NOMES SIGNIFICATIVOS
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)...
2) NOMES SIGNIFICATIVOS
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell c...
3) FUNÇÕES
PEQUENAS
3) FUNÇÕES
PEQUENAS
3) FUNÇÕES (PEQUENAS!)
3) FUNÇÕES (PEQUENAS!)
3) FUNÇÕES (PEQUENAS!)
3) FUNÇÕES (PEQUENAS!)
3) FUNÇÕES (PEQUENAS!)
- Empírico
- Anos 80 - não maior que altura da tela (24 linhas)
- 20 linhas no máximo do máximo
- B...
3) FUNÇÕES (PEQUENAS!)
Funções devem fazer UMA coisa.
Devem fazer isso bem.
Devem fazer apenas isso.
- O que é 1 coisa?
- ...
3) FUNÇÕES (PEQUENAS!)
3) FUNÇÕES (PEQUENAS!)
- Níveis de abstração:
- Alto - getHtml
- Médio - String pagePath = PathParser.render(pagePath)
- B...
3) FUNÇÕES (PEQUENAS!)
- Usar nomes descritivos
- Difícil superestimar valor de bons nomes
- Quanto menor e mais focada fu...
3) FUNÇÕES (PEQUENAS!)
- Argumentos
- 0 - ideal
- 1-2 - normal
- 3 - evitar ao máximo
- 4+ - não usar
- Dificultam muito e...
3) FUNÇÕES (PEQUENAS!)
- Casos principais de acordo com qtde de argumentos
- 1
- Fazer pergunta
- fileExist("myFile")
- Op...
3) FUNÇÕES (PEQUENAS!)
- NÃO GERAR EFEITOS COLATERAIS
- Não faça coisas escondidas
- checkPassword(username, pass)
...
ses...
3) FUNÇÕES (PEQUENAS!)
Princípio DRY
DON'T REPEAT YOURSELF
Duplicação pode ser a raiz de todo o mal em software
3) FUNÇÕES (PEQUENAS!)
- Como escrever código bom assim?
- É igual escrever livro -> 1o põe idéias no papel, depois refina...
3) FUNÇÕES (PEQUENAS!)
- Mudança incremental, MANTENDO TESTES PASSANDO, um passo de cada
vez (baby steps)
3) FUNÇÕES (PEQUENAS!)
Arte de programar é a arte de design de idioma
Funções são a linguagem para ajudar a contar históri...
4) COMENTÁRIOS
- Explique-se por código
- Comentários bons
- Informações legais
- Explicação de intenção
- Aviso de conseq...
4) COMENTÁRIOS
4) COMENTÁRIOS
4) COMENTÁRIOS
4) COMENTÁRIOS
- Comentários ruins
- Comentar só por achar que precisa comentar
- Redundantes
- Ruído
- Código comentado
-...
4) COMENTÁRIOS
- Comentários ruins
- Comentar só por achar que precisa comentar
- Redundantes
- Ruído
- Código comentado
-...
4) COMENTÁRIOS
4) COMENTÁRIOS
4) COMENTÁRIOS
- Código comentado
- Por que essas 2 linhas estão comentadas? São importantes?
- Outros não terão coragem d...
17) BAD SMELLS
17) BAD SMELLS
- Código comentado
- Comentário ao invés de código
- Comentário obsoleto
- Argumentos demais em função
- Có...
17) BAD SMELLS
- Usar variáveis explanatórias
Matcher match = headerPattern.matcher(line);
if(match.find())
{
headers.put(...
17) BAD SMELLS
- Usar variáveis explanatórias
Matcher match = headerPattern.matcher(line);
if(match.find())
{
String key =...
17) BAD SMELLS
- Constantes no lugar de números mágicos
O que é mais fácil de entender, e de procurar?
assertEquals(7777, ...
17) BAD SMELLS
- Encapsular condições
if (timer.hasExpired() && !timer.isRecurrent())
if (shouldBeDeleted(timer))
17) BAD SMELLS
- Função fazer mais de uma coisa
17) BAD SMELLS
- Testes
- Insuficientes
- Não ter relatório de cobertura de testes
OBSERVAÇÕES PESSOAIS
- Refactor para deixar sempre código melhor do que pegou
- Para permitir Refactor:
- Testes
- Testes
...
OBSERVAÇÕES PESSOAIS
- Testes
- F.I.R.S.T. - Fast, Independent, Repeatable, Self-
Validating, Timely
OBSERVAÇÕES PESSOAIS
Funções e classes pequenas
Facilita entendimento, cada bloco só ter 1 nível de abstração
“Fazer uma c...
Bora escrever código limpo?
Clean Code
Próximos SlideShares
Carregando em…5
×

Clean Code

444 visualizações

Publicada em

Resumão do que achei bacana do livro Clean Code, do Uncle Bob.

Publicada em: Tecnologia
1 comentário
0 gostaram
Estatísticas
Notas
  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
444
No SlideShare
0
A partir de incorporações
0
Número de incorporações
4
Ações
Compartilhamentos
0
Downloads
7
Comentários
1
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Clean Code

  1. 1. CLEAN CODE Robert C. Martin Renato Chencinski - 09/04/2014 renato@inspira.com.br
  2. 2. 1) O QUE É CÓDIGO LIMPO - Michael Feathers - Clean code always looks like it was written by someone who cares. - Ron Jeffries / Kent Beck 1) Run all tests 2) No duplication 3) Express design ideas 4) Minimizes # of entities (classes, methods, ..)
  3. 3. 1) O QUE É CÓDIGO LIMPO - Ward Cunningham - Each routine you read is pretty much what you expected
  4. 4. 1) O QUE É CÓDIGO LIMPO Paradigma: Razão de tempo lendo código vs escrevendo: > 10:1 - Fazer software fácil de ler é fazer ele fácil de escrever - Código enxuto, sem textos poluindo que atrasem entendimento - Poucos comentários - Classes / funções pequenas - Níveis de abstração coerentes com contexto - Código expressivo
  5. 5. COMO MEDIR SE CÓDIGO É LIMPO?
  6. 6. COMENTÁRIOS Comentário desatualizado /** * Always returns true. */ public boolean isAvailable() { return false; } //private instance variable for storing age public static int age; http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered?page=1&tab=votes#tab-top
  7. 7. COMENTÁRIOS Comentário inusitado // somedev1 - 6/7/02 Adding temporary tracking of Login screen // somedev2 - 5/22/07 Temporary my ass
  8. 8. COMENTÁRIOS Comentários úteis return 1; # returns 1 i++; // increase i by 1
  9. 9. FÁCIL LEITURA E ENTENDIMENTO GlobalConfiguration.Configuration.Filters.Add(new HandleAndLogErrorAttribute()); ViewEngines.Engines.RemoveAt(1); Domains = Empresa.SelectAllURLs(new Context()).ToDictionary(e => e.Dominio, e => new ViewTema() { ViewNome = e.ViewNome, Tema = e.Tema }); ViewEngines.Engines.Add(new CustomViewEngine(Domains));
  10. 10. FÁCIL LEITURA E ENTENDIMENTO GlobalConfiguration.Configuration.Filters.Add(new HandleAndLogErrorAttribute()); ViewEngines.Engines.RemoveAt(1); Domains = ObtemViewsETemasDaEmpresa(); ViewEngines.Engines.Add(new CustomViewEngine(Domains));
  11. 11. FÁCIL LEITURA E ENTENDIMENTO public static KeyValuePair<string, ViewTema> FindDominio(Dictionary<string, ViewTema> dominios, Uri url) { return dominios.FirstOrDefault(e => e.Key.Split(';').FirstOrDefault(s => String.Equals(s, url.Authority, StringComparison.CurrentCultureIgnoreCase)) != null); }
  12. 12. FÁCIL LEITURA E ENTENDIMENTO [Código de função gigante]
  13. 13. 2) NOMES SIGNIFICATIVOS - Revelam intenção - int elapsedTimeInDays - Usar constantes para explicar valores - cell[0] -> cell[STATUS_VALUE] - Refactor nos nomes sempre para deixar mais significativo
  14. 14. 2) NOMES SIGNIFICATIVOS public List<int[]> getThem() { List<int[]> list1 = new ArrayList<int[]>(); for (int[] x : theList) if (x[0] == 4) list1.add(x); return list1; }
  15. 15. 2) NOMES SIGNIFICATIVOS public List<Cell> getFlaggedCells() { List<Cell> flaggedCells = new ArrayList<Cell>(); for (Cell cell : gameBoard) if (cell.isFlagged()) flaggedCells.add(cell); return flaggedCells; }
  16. 16. 3) FUNÇÕES PEQUENAS
  17. 17. 3) FUNÇÕES PEQUENAS
  18. 18. 3) FUNÇÕES (PEQUENAS!)
  19. 19. 3) FUNÇÕES (PEQUENAS!)
  20. 20. 3) FUNÇÕES (PEQUENAS!)
  21. 21. 3) FUNÇÕES (PEQUENAS!)
  22. 22. 3) FUNÇÕES (PEQUENAS!) - Empírico - Anos 80 - não maior que altura da tela (24 linhas) - 20 linhas no máximo do máximo - Blocos e indentações - Por ser pequena, if / while / etc terão 1 ou 2 linhas - Indentação 1 ou 2
  23. 23. 3) FUNÇÕES (PEQUENAS!) Funções devem fazer UMA coisa. Devem fazer isso bem. Devem fazer apenas isso. - O que é 1 coisa? - Apenas 1 nível de abstração abaixo do nome da função. - Consegue descrever em uma sentença.
  24. 24. 3) FUNÇÕES (PEQUENAS!)
  25. 25. 3) FUNÇÕES (PEQUENAS!) - Níveis de abstração: - Alto - getHtml - Médio - String pagePath = PathParser.render(pagePath) - Baixo - append("n") - Misturar níveis confunde, dificulta para o leitor saber se é importante ou se é detalhe
  26. 26. 3) FUNÇÕES (PEQUENAS!) - Usar nomes descritivos - Difícil superestimar valor de bons nomes - Quanto menor e mais focada função, mais fácil será dar nome - Melhor nome longo que comentário - Não ter medo de usar tempo para escolher nome bom testableHtml -> includeSetupAndTeardownPages
  27. 27. 3) FUNÇÕES (PEQUENAS!) - Argumentos - 0 - ideal - 1-2 - normal - 3 - evitar ao máximo - 4+ - não usar - Dificultam muito entendimento - Dificulta testes - casos de teste crescem exponencialmente - Usar variável membro de classe ao invés de passar arg de fç pra outra
  28. 28. 3) FUNÇÕES (PEQUENAS!) - Casos principais de acordo com qtde de argumentos - 1 - Fazer pergunta - fileExist("myFile") - Operar sobre argumento e transformar em algo e retornar - InputStream FileOpen("MyFile") - Flags - Muito ruim, indício que função está fazendo mais de uma coisa - Ex: - .render(true) - ininteligível - mouse over render -> bool isSuite - menos ruim - render(isSuite) - renderForSuite() / renderForSingleTest() - 2 - Point p(0,0) - 3 - assertEquals(1.0, ammount, 0.001)
  29. 29. 3) FUNÇÕES (PEQUENAS!) - NÃO GERAR EFEITOS COLATERAIS - Não faça coisas escondidas - checkPassword(username, pass) ... session.Initialize() checkPasswordAndInitializeSession() Melhor, mas já fica evidente que viola "faça uma coisa"
  30. 30. 3) FUNÇÕES (PEQUENAS!) Princípio DRY DON'T REPEAT YOURSELF Duplicação pode ser a raiz de todo o mal em software
  31. 31. 3) FUNÇÕES (PEQUENAS!) - Como escrever código bom assim? - É igual escrever livro -> 1o põe idéias no papel, depois refina - Passos - Escreve rascunho - Testes para tudo - Refatora até ficar bom NÃO É ESPERADO QUE 1A VEZ SEJA PERFEITO
  32. 32. 3) FUNÇÕES (PEQUENAS!) - Mudança incremental, MANTENDO TESTES PASSANDO, um passo de cada vez (baby steps)
  33. 33. 3) FUNÇÕES (PEQUENAS!) Arte de programar é a arte de design de idioma Funções são a linguagem para ajudar a contar história do sistema
  34. 34. 4) COMENTÁRIOS - Explique-se por código - Comentários bons - Informações legais - Explicação de intenção - Aviso de consequências
  35. 35. 4) COMENTÁRIOS
  36. 36. 4) COMENTÁRIOS
  37. 37. 4) COMENTÁRIOS
  38. 38. 4) COMENTÁRIOS - Comentários ruins - Comentar só por achar que precisa comentar - Redundantes - Ruído - Código comentado - Excesso de informação
  39. 39. 4) COMENTÁRIOS - Comentários ruins - Comentar só por achar que precisa comentar - Redundantes - Ruído - Código comentado - Excesso de informação
  40. 40. 4) COMENTÁRIOS
  41. 41. 4) COMENTÁRIOS
  42. 42. 4) COMENTÁRIOS - Código comentado - Por que essas 2 linhas estão comentadas? São importantes? - Outros não terão coragem de apagar, por achar que pode ser importante
  43. 43. 17) BAD SMELLS
  44. 44. 17) BAD SMELLS - Código comentado - Comentário ao invés de código - Comentário obsoleto - Argumentos demais em função - Código em nível errado de abstração
  45. 45. 17) BAD SMELLS - Usar variáveis explanatórias Matcher match = headerPattern.matcher(line); if(match.find()) { headers.put(match.group(1), match.group(2)); }
  46. 46. 17) BAD SMELLS - Usar variáveis explanatórias Matcher match = headerPattern.matcher(line); if(match.find()) { String key = match.group(1); String value = match.group(2); headers.put(key.toLowerCase(), value); }
  47. 47. 17) BAD SMELLS - Constantes no lugar de números mágicos O que é mais fácil de entender, e de procurar? assertEquals(7777, Employee.find(“John Doe”).employeeNumber()); assertEquals( HOURLY_EMPLOYEE_ID, Employee.find(HOURLY_EMPLOYEE_NAME).employeeNumber());
  48. 48. 17) BAD SMELLS - Encapsular condições if (timer.hasExpired() && !timer.isRecurrent()) if (shouldBeDeleted(timer))
  49. 49. 17) BAD SMELLS - Função fazer mais de uma coisa
  50. 50. 17) BAD SMELLS - Testes - Insuficientes - Não ter relatório de cobertura de testes
  51. 51. OBSERVAÇÕES PESSOAIS - Refactor para deixar sempre código melhor do que pegou - Para permitir Refactor: - Testes - Testes - Testes - Code Review – forma excelente de refactor e aprender
  52. 52. OBSERVAÇÕES PESSOAIS - Testes - F.I.R.S.T. - Fast, Independent, Repeatable, Self- Validating, Timely
  53. 53. OBSERVAÇÕES PESSOAIS Funções e classes pequenas Facilita entendimento, cada bloco só ter 1 nível de abstração “Fazer uma coisa” é mais fácil de ser seguido Comentários bem menos necessários Evita indentação excessiva que complica entendimento Facilita ver começo e fim de bloco (ex: if-else), sem precisar rolar página pra cima e pra baixo
  54. 54. Bora escrever código limpo?

×