O documento discute princípios de código limpo, definindo-o como código que funciona, é fácil de ler e entender, e eficiente. Apresenta dicas para escrever código melhor, como usar nomes significativos, métodos limpos, comentários úteis, formatação consistente e tratar erros adequadamente. Também discute como escrever testes limpos e detectar código ruim.
2. Desenvolv
Manutenção de Software
% do tempo gasto lendo código vs escrevendo
Intelectualmente Complexo
Documentação?
Se não está quebrado, não arrume
Mais dificil a cada iteração
3. Definição Código Limpo
Funciona
É facil de ler
Simples de entender
Eficiente (sem rodeios)
Fácil de estender
Limpo (alguém se importou)
13. Detectando Código Ruim
Código não usado
Código duplicado
Muitos parametros no método
Método longo (+ de 20 linhas)
Complexidade condicional
Generalidade especulativa
Comentários (o que ao invés do porque)
Para uma lista mais completa acesse: http://www.codinghorror.com/blog/2006/05/code-smells.html
15. Conceitos Gerais
Ajude o próximo, pois o próximo pode ser você
Não crie abstrações pensando no futuro
Não tenha medo de alterar, na pior das hipóteses já
estava quebrado mesmo
Não otimize prematuramente
Prefira composição ao invés de herança
Evite métodos estáticos/singletons
Deletar código é mais divertido que criar
16. Use Nomes Significativos
Use nomes que revelam a intenção
Dê preferência à linguagem do cliente (Ubiquitous
Language)
Não economize caracteres
Não seja engraçado
Evite prefixos (strMinhaVariavel)
Se não está claro, renomeie
Não use caracteristicas da variável
Date yyyyMMdd = ...
Color azul = Color.RED; //CÓDIGO RUIM
17. Use Nomes Significativos
public List<Cell> getCelulas() {
List<Cell> lst = new ArrayList<Cell>();
for (Cell c : dados)
if (c.getStatus() == 4)
lst.add(c);
return lst;
}
18. Use Nomes Significativos
public List<Cell> getCelulasMarcadas() {
List<Cell> celulasMarcadas = new ArrayList<>();
for (Cell cell : gameBoard)
if (cell.isMarcada()) {
celulasMarcadas.add(cell);
}
return celulasMarcadas;
}
19. Métodos Limpos
Devem ser pequenos
Sério, ainda menores do que isso
Devem fazer apenas uma coisa
Melhor se organizados de cima para baixo
Evite usar variáveis globais, use parâmetros
Não tem side effects
Uma entrada, uma saída
Não tem código duplicado (DRY)
Muitos parâmetros? Troque por uma classe
24. Comentários Limpos
Explique o porque, não o que
Evite redundância
//Pega os usuários
List usuarios = getUsuarios();
//Pega os usuários novamente porque o cache pode
estar desatualizado
List usuarios = getUsuarios();
25. Comentários Limpos
Se precisar usar comentários, provavelmente deveria
criar um método no lugar dele
List idClientes = ...
//Pega clientes do banco
for (Cliente cli : idClientes) {
...
}
List idClientes = ...
getClientesDoBanco(idClientes);
26. Comentários Limpos
// Verifica se o empregado é elegível a todos os benefícios
if ((empregado.flags & HOURLY_FLAG) &&
(empregado.age > 65))
if (empregado.isEligivelTodosBeneficios())
27. Comentários Limpos
while ((line = in.readLine()) != null) {
...
} //fim while
// InputStream results = formatter.getResultStream();
// Reader reader = new StreamReader(results);
//TODO Validar o código recebido
28. Formatação Limpa
Seu propósito é melhorar a comunicação
Siga o padrão de formatação do projeto/time
Declare a variável o mais perto possível de onde ela é
usada
Sempre use chaves
if (logado) {
loginsCount++;
}
29. Formatação Limpa
Use agrupamento vertical para separar código não
relacionado
List clientes = ...
clientesAtivos = selecionarAtivos(clientes);
gerarBoletosPara(clientesAtivos);
gravarFlagBoletosGerados(clientesAtivos);
gravarLogProcesso(clientesAtivos, msgSucesso);
dispararEmailsDeBoletoDisponivel(clientesAtivos);
30. Tratamento de Erros Limpo
Ou você faz log ou throw, nunca os dois
Use log4j (ou outros), System.out é mau
Prefira RuntimeException
32. Tratamento de Erros Limpo
Sempre que possível, não retorne null
List<Employee> employees = getEmployees();
for(Employee e : employees) {
totalPay += e.getPay();
}
}
public List<Employee> getEmployees() {
if( .. there are no employees .. ) {
return Collections.emptyList();
}
}
33. Testes Limpos
Trate seu teste igual ao código de produção
Prefira testes unitários
Verifique um conceito por teste
Verifique um conceito por teste (importante)
Sempre execute todos os testes
Não use o construtor da classe de teste, use @Before e
@BeforeClass
Sem setup/verificações manuais
Quanto mais simples, melhor