Clean Code
Manutenção e Evolução de Software
Prof. Renato Sampaio
1
Código
• Realidade do Desenvolvimento:
• Cronogramas apertados
• Necessidades urgentes
• Vou fazer funcionar e depois eu melhoro…
2
Código
3
Código
• Problemas:
• Código ruim:
• é inflexível
• é frágil
• é inseparável
• é incompreensível
• custa caro
• é difícil manter
• gera baixa produtividade na equipe
• gera mais código ruim - remendos
4
O que é Clean Code?
5
O que é código limpo?
“I like my code to be elegant and
efficient. The logic should be
straighforward to make it hard for bugs
to hide, the dependencies minimal to
ease maintenance, error handling
complete according to an articulated
strategy, and performance close to
optimal so as not to tempt people to
make the code messy with unprincipled
optimizations. Clean code does one
thing well.”
Bjarne Stroustrup
Inventor of C++
6 3
Fonte: Paulo Meirelles, Monitoramento de Métricas de Código-Fonte
O que é código limpo?
“Clean code is simple and direct. Clean
code reads like well-written prose.
Clean code never obscures the designer's
intent but rather is full of crisp [clearly
defined] abstractions and straighforward
lines of control.”
Grady Booch
Author of Object Oriented Analysis and
Design with Applications
7 4
Fonte: Paulo Meirelles, Monitoramento de Métricas de Código-Fonte
O que é código limpo?
“Clean code can be read, and enhanced
by a developer other than its original
author. It has unit and acceptance
tests. It has meaningful names. It
provides one way rather than many ways
for doing one thing. It has minimal
dependencies, which are explicitly
defined, and provides a clear and minimal
API. Code should be literate since
depending on the language, not all
necessary information can be expressed
clearly in code alone.”
Dave Thomas
Founder of OTI, godfather of
the Eclipse Strategy 8 5
Fonte: Paulo Meirelles, Monitoramento de Métricas de Código-Fonte
O que é código limpo?
“I could list all of the qualities that I
notice in clean code, but there is one
overarching quality that leads to all of
them. Clean code always looks it was
written by someone who cares. There
is nothing obvious that you can do to
make it better. All of those things were
thought about by the code's author, and
if you try to imagine improvements, you're
led back to where you are, sitting in
appreciation of the code someone left for
you – code left by someone who cares
deeply about the craft.”
Michael Feathers
Author of Working Effectively
With Legacy Code 9 6
Fonte: Paulo Meirelles, Monitoramento de Métricas de Código-Fonte
O que é código limpo?
“In recent years I begin, and nearly end,
with Beck's rules of simple code. In
priority order, simple code:
●
Runs all tests
●
Contains no duplication
●
Expresses all the design ideas that
are in the system
●
Minimizes the number of entities
such as classes, methods, functions,
and the like.”
Ron Jeffries
Author of Extreme
Programming Installed
10 7
Fonte: Paulo Meirelles, Monitoramento de Métricas de Código-Fonte
O que é código limpo?
You know you are working on clean code
when each routine you read turns out
to be pretty much what you expected.
You can call it beautiful code when the
codes also makes it look like the
language was made for the problem.”
Ward Cunningham
Inventor of Wiki, Fit and much more
”Godfather of all those who care about
code” 11 8
Fonte: Paulo Meirelles, Monitoramento de Métricas de Código-Fonte
O que é código limpo?
Without obvious
Simple
Efficient improvements
Straightforward
Expressive
Contains no
Turns out to be what
duplications
you expected Runs all tests
Full of meaning Literal Reads well
Beautiful: when the Minimal
language was made Written by
for the problem someone who
9
cares
12
Fonte: Paulo Meirelles, Monitoramento de Métricas de Código-Fonte
O que é Clean Code?
13
Clean Code
• Nomes Significativos
• Revelam intenção
• Devem ser pronunciáveis
• Fácil de pesquisar
• Evitar nomes ambíguos
• Classes - substantivo
• Métodos - verbos
14
Clean Code
• Nomes Significativos
15
Clean Code
• Métodos / Funções
• Pequenos
• Uma única responsabilidade
• Mínimo de encadeamento (if … if … if …)
• Mínimo de parâmetros (caso necessário
utilize um objeto como parâmetro.
• Evitar flags como parâmetros
• DRY - Don’t Repeat Yourself
16
Clean Code
• Métodos / Funções
• Composição de métodos (Mesmo nível de
abstração)
17
Exemplo - Composição de Métodos
def custosAPartirDoVertice(vertice):
custos = novo Lista(numeroDeVertices)
fila = nova FilaDePrioridades(numeroDeVertices)
for i in (1, numeroDeVertices):
custos[i] = -1
custos[vertice] = 0
fila.insere(nova Aresta(0,0))
while(fila.vazia()):
verticeDoMomento = fila.verticeDaArestaComCustoMinimo()
for aresta in (arestasDoVertice(verticeDoMomento)):
verticeDestino = aresta.verticeDestino()
custo = aresta.custo()
if(custos[verticeDestino] == -1):
custos[verticeDestino] = custos[verticeDoMomento] + custo
fila.insere(nova Aresta(verticeDestino, custos[verticeDestino]))
else if(custos[verticeDestino] > custos[verticeDoMomento] + custo):
custos[verticeDestino] = custos[verticeDoMomento] + custo
return custos
18
Exemplo - Composição de Métodos
def custosAPartirDoVertice(vertice):
inicializaCustos()
inicializaFila()
atualizaCustosAteAcabarVertices()
def inicializaCustos(vertice)
def inicializaFila(vertice):
for i in (1, numeroDeVertices):
fila = nova FilaDePrioridades()
custos[i] = -1
fila.insere(nova Aresta(0,0))
custos[vertice] = 0
def atualizaCustosAteAcabarVertices():
while(fila.vazia()):
verticeDoMomento = fila.verticeDaArestaComCustoMinimo()
atualizaCustosAPartirDe(vertice)
19
Clean Code
• Tratamento de Erros
• Uso de Exceções
20
Clean Code
• Comentários
• Úteis em locais certos
• Comentários geralmente não são
atualizados
• Comentário não transforma código ruim em
bom.
21
Clean Code
• Formatação
• Padronização do projeto / equipe.
• Classes menores - mais fáceis de
compreender
• Conceitos relacionados devem estar
próximos
• Endentação
22
Clean Code
• Classes
• Posicionar atributos e métodos agrupados
• Princípio da Responsabilidade única
• Coesão
• Acoplamento entre classes
23
Clean Code
• Classes
• Coesão
24
Clean Code
• Classes
• Acoplamento
25
Clean Code
• Classes
• Acoplamento
A Lei de Demeter (The Law of Demeter)
• Um método “M” de uma classe “C” só deveria
chamar um método:
• da própria classe;
• de um objeto criado por M;
• de um objeto passado como argumento para M;
• de um objeto guardado em uma variável de
instância de C.
26
Clean Code
• Classes
• Acoplamento
27
Métricas de Código Fonte
• Métricas no contexto de software orientado a
objetos
28
Métricas de Código Fonte
• LOC - Número de Linhas
• NOA - Número de Atributos
• NOM - Número de Métodos
• NP - Número de Parâmetros
• NRP - Número de Repasses de Parâmetros (NRP)
• SLOC - Soma do Número de linhas
• AMLOC - Média do Número de Linhas Por
Método
• LCOM4 - Falta de Coesão Entre Métodos
29
Métricas de Código Fonte
• NC - Número de Chamadas
• NEC - Número de Chamadas Externas
• ECR - Taxa de Chamadas Externas
• NCC - Número de Classes Chamadas
• NRA - Número de Atributos Alcançáveis
• MaxNesting - Nível Máximo de Estruturas
Encadeadas
• ACCM - CYCLO - Complexidade Ciclomática
• DIT - Profundidade da árvore de herança
30
Métricas de Código Fonte
• Code Climate (https://docs.codeclimate.com/
docs/maintainability)
• Analizo (http://www.analizo.org)
31