SlideShare uma empresa Scribd logo
1 de 55
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 Jeffries / Kent Beck
1) Run all tests
2) No duplication
3) Express design ideas
4) Minimizes # of entities (classes, methods, ..)
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 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
COMO MEDIR SE CÓDIGO É LIMPO?
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
COMENTÁRIOS
Comentário inusitado
// somedev1 - 6/7/02 Adding temporary tracking of Login screen
// somedev2 - 5/22/07 Temporary my ass
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.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));
FÁCIL LEITURA E ENTENDIMENTO
GlobalConfiguration.Configuration.Filters.Add(new
HandleAndLogErrorAttribute());
ViewEngines.Engines.RemoveAt(1);
Domains = ObtemViewsETemasDaEmpresa();
ViewEngines.Engines.Add(new CustomViewEngine(Domains));
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);
}
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] -> cell[STATUS_VALUE]
- Refactor nos nomes sempre para deixar mais significativo
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;
}
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;
}
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
- Blocos e indentações
- Por ser pequena, if / while / etc terão 1 ou 2 linhas
- Indentação 1 ou 2
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.
3) FUNÇÕES (PEQUENAS!)
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
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
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
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)
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"
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
- Passos
- Escreve rascunho
- Testes para tudo
- Refatora até ficar bom
NÃO É ESPERADO QUE 1A VEZ SEJA PERFEITO
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ória do
sistema
4) COMENTÁRIOS
- Explique-se por código
- Comentários bons
- Informações legais
- Explicação de intenção
- Aviso de consequências
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
- Excesso de informação
4) COMENTÁRIOS
- Comentários ruins
- Comentar só por achar que precisa comentar
- Redundantes
- Ruído
- Código comentado
- Excesso de informação
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 de apagar, por achar que pode ser
importante
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ódigo em nível errado de abstração
17) BAD SMELLS
- Usar variáveis explanatórias
Matcher match = headerPattern.matcher(line);
if(match.find())
{
headers.put(match.group(1), match.group(2));
}
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);
}
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());
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
- Testes
- Code Review – forma excelente de refactor e aprender
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 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
Bora escrever código limpo?

Mais conteúdo relacionado

Destaque

TDC 2014 POA - Clean Code para Testers
TDC 2014 POA - Clean Code para TestersTDC 2014 POA - Clean Code para Testers
TDC 2014 POA - Clean Code para TestersStefan Teixeira
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Rodrigo Kono
 
Clean Code I - Best Practices
Clean Code I - Best PracticesClean Code I - Best Practices
Clean Code I - Best PracticesTheo Jungeblut
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 
Clean code: programando com WordPress de forma profissional
Clean code: programando com WordPress de forma profissionalClean code: programando com WordPress de forma profissional
Clean code: programando com WordPress de forma profissionalLeo Baiano
 
TDC 2013 POA: TDD e Clean Code, garantia de um desenvolvimento saudável
TDC 2013 POA: TDD e Clean Code, garantia de um desenvolvimento saudável TDC 2013 POA: TDD e Clean Code, garantia de um desenvolvimento saudável
TDC 2013 POA: TDD e Clean Code, garantia de um desenvolvimento saudável Mauricio Andreazza
 
Agile Brazil 2013: TDD e Clean Code, garantia de um desenvolvimento saudável
Agile Brazil 2013: TDD e Clean Code, garantia de um desenvolvimento saudávelAgile Brazil 2013: TDD e Clean Code, garantia de um desenvolvimento saudável
Agile Brazil 2013: TDD e Clean Code, garantia de um desenvolvimento saudávelMauricio Andreazza
 

Destaque (13)

TDC 2014 POA - Clean Code para Testers
TDC 2014 POA - Clean Code para TestersTDC 2014 POA - Clean Code para Testers
TDC 2014 POA - Clean Code para Testers
 
Clean Code
Clean CodeClean Code
Clean Code
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)
 
Clean Code
Clean CodeClean Code
Clean Code
 
Clean code
Clean codeClean code
Clean code
 
Clean Code I - Best Practices
Clean Code I - Best PracticesClean Code I - Best Practices
Clean Code I - Best Practices
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 
Clean code: programando com WordPress de forma profissional
Clean code: programando com WordPress de forma profissionalClean code: programando com WordPress de forma profissional
Clean code: programando com WordPress de forma profissional
 
TDC 2013 POA: TDD e Clean Code, garantia de um desenvolvimento saudável
TDC 2013 POA: TDD e Clean Code, garantia de um desenvolvimento saudável TDC 2013 POA: TDD e Clean Code, garantia de um desenvolvimento saudável
TDC 2013 POA: TDD e Clean Code, garantia de um desenvolvimento saudável
 
Agile Brazil 2013: TDD e Clean Code, garantia de um desenvolvimento saudável
Agile Brazil 2013: TDD e Clean Code, garantia de um desenvolvimento saudávelAgile Brazil 2013: TDD e Clean Code, garantia de um desenvolvimento saudável
Agile Brazil 2013: TDD e Clean Code, garantia de um desenvolvimento saudável
 
TDD com Clean Code: Chega de amadorismo!
TDD com Clean Code: Chega de amadorismo!TDD com Clean Code: Chega de amadorismo!
TDD com Clean Code: Chega de amadorismo!
 
Clean Code
Clean CodeClean Code
Clean Code
 
TDD e Clean Code
TDD e Clean CodeTDD e Clean Code
TDD e Clean Code
 

Semelhante a Clean Code

Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3klaussilveira
 
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasRuby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasÉverton Ribeiro
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9Nando Vieira
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPiMasters
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoronaldoferraz
 
Resumão BB Direção Concursos.pdf banco do brasil
Resumão BB Direção Concursos.pdf banco do brasilResumão BB Direção Concursos.pdf banco do brasil
Resumão BB Direção Concursos.pdf banco do brasilmacumbamaranhao19
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na práticaRafael Cassau
 
(03) shell e comandos basicos[1]
(03) shell e comandos basicos[1](03) shell e comandos basicos[1]
(03) shell e comandos basicos[1]Anderson Lago
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super heroElton Minetto
 
Tradutor de Pig Latin
Tradutor de Pig LatinTradutor de Pig Latin
Tradutor de Pig LatinElen Arantza
 
Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Hugo Maia Vieira
 
Linux - Shell e Comandos Básicos
Linux - Shell e Comandos BásicosLinux - Shell e Comandos Básicos
Linux - Shell e Comandos BásicosFrederico Madeira
 

Semelhante a Clean Code (20)

Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3
 
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasRuby e Erlang de mãos dadas
Ruby e Erlang de mãos dadas
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
 
2006 - Linguagem VB.ppt
2006 - Linguagem VB.ppt2006 - Linguagem VB.ppt
2006 - Linguagem VB.ppt
 
Shell script
Shell script Shell script
Shell script
 
Linux shell
Linux shellLinux shell
Linux shell
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
 
Testes de Sofware
Testes de SofwareTestes de Sofware
Testes de Sofware
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
Php Math and arrays
Php Math and arraysPhp Math and arrays
Php Math and arrays
 
Resumão BB Direção Concursos.pdf banco do brasil
Resumão BB Direção Concursos.pdf banco do brasilResumão BB Direção Concursos.pdf banco do brasil
Resumão BB Direção Concursos.pdf banco do brasil
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
1° Madrugada de Testes
1° Madrugada de Testes1° Madrugada de Testes
1° Madrugada de Testes
 
(03) shell e comandos basicos[1]
(03) shell e comandos basicos[1](03) shell e comandos basicos[1]
(03) shell e comandos basicos[1]
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Tradutor de Pig Latin
Tradutor de Pig LatinTradutor de Pig Latin
Tradutor de Pig Latin
 
Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)
 
Linux - Shell e Comandos Básicos
Linux - Shell e Comandos BásicosLinux - Shell e Comandos Básicos
Linux - Shell e Comandos Básicos
 
TDD na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
Refactoring to patterns
Refactoring to patternsRefactoring to patterns
Refactoring to patterns
 

Clean Code

  • 1. CLEAN CODE Robert C. Martin Renato Chencinski - 09/04/2014 renato@inspira.com.br
  • 2.
  • 3. 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, ..)
  • 4. 1) O QUE É CÓDIGO LIMPO - Ward Cunningham - Each routine you read is pretty much what you expected
  • 5. 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
  • 6. COMO MEDIR SE CÓDIGO É LIMPO?
  • 7. 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
  • 8. COMENTÁRIOS Comentário inusitado // somedev1 - 6/7/02 Adding temporary tracking of Login screen // somedev2 - 5/22/07 Temporary my ass
  • 9. COMENTÁRIOS Comentários úteis return 1; # returns 1 i++; // increase i by 1
  • 10. 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));
  • 11. FÁCIL LEITURA E ENTENDIMENTO GlobalConfiguration.Configuration.Filters.Add(new HandleAndLogErrorAttribute()); ViewEngines.Engines.RemoveAt(1); Domains = ObtemViewsETemasDaEmpresa(); ViewEngines.Engines.Add(new CustomViewEngine(Domains));
  • 12. 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); }
  • 13. FÁCIL LEITURA E ENTENDIMENTO [Código de função gigante]
  • 14. 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
  • 15. 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; }
  • 16. 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; }
  • 23. 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
  • 24. 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.
  • 26. 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
  • 27. 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
  • 28. 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
  • 29. 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)
  • 30. 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"
  • 31. 3) FUNÇÕES (PEQUENAS!) Princípio DRY DON'T REPEAT YOURSELF Duplicação pode ser a raiz de todo o mal em software
  • 32. 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
  • 33. 3) FUNÇÕES (PEQUENAS!) - Mudança incremental, MANTENDO TESTES PASSANDO, um passo de cada vez (baby steps)
  • 34. 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
  • 35. 4) COMENTÁRIOS - Explique-se por código - Comentários bons - Informações legais - Explicação de intenção - Aviso de consequências
  • 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. 4) COMENTÁRIOS - Comentários ruins - Comentar só por achar que precisa comentar - Redundantes - Ruído - Código comentado - Excesso de informação
  • 43. 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
  • 45. 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
  • 46. 17) BAD SMELLS - Usar variáveis explanatórias Matcher match = headerPattern.matcher(line); if(match.find()) { headers.put(match.group(1), match.group(2)); }
  • 47. 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); }
  • 48. 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());
  • 49. 17) BAD SMELLS - Encapsular condições if (timer.hasExpired() && !timer.isRecurrent()) if (shouldBeDeleted(timer))
  • 50. 17) BAD SMELLS - Função fazer mais de uma coisa
  • 51. 17) BAD SMELLS - Testes - Insuficientes - Não ter relatório de cobertura de testes
  • 52. 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
  • 53. OBSERVAÇÕES PESSOAIS - Testes - F.I.R.S.T. - Fast, Independent, Repeatable, Self- Validating, Timely
  • 54. 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