SlideShare uma empresa Scribd logo
1 de 51
Rogério Fontes
@rogeriofontes
http://rogeriofontes.inf.br
Arquiteto Java.
Apaixonado em código e formas ágeis de criá-los, Lider do UaiJUG
(Grupo de Usuários do Triângulo Mineiro, Lider Tecnico Everis.
Clean Code
Agenda
O que é um código limpo?
O que é um código ruim?
Quanto custa um código ruim?
O que se fala de código limpo?
Como deve ser um código limpo.
Algumas regras para melhorar seu código.
Equipe
Tenho um problema para resolver,
mas o tempo está curto. “Bora” resolver?
Funciona, mais é viável?
Funciona, mais é viável?
Ao resolver problemas e entregar solução temos que
pensar na melhor forma de faze-lo, não
simplesmente resolver momentaneamente.
Quando vemos um problema ou uma “gambiara”
temos a responsabilidade de arrumar.
Temos que ter em mente a regra do escoteiro.
Regra do escoteiro
“Você deve sempre deixar o lugar
mais limpo do que encontrou”
Clean code
Clean code
O que representa um código limpo:
Eficiencia
Única responsabilidade
Clean code
O que representa um código ruim:
Que não é legível a outros programadores
Multiplica o tempo gasto ao codificar.
Código ruim
Porque fazemos?
 Estava com pressa?
 Seu chefe cobrando a toda hora (Gerente tele-
sena)?
 Cansado?
 Estressado?
 Cronograma estourado?
Código ruim
Código ruim custa caro
Voltando ao Limpo.
O que se fala sobre código limpo:
Clean coders
• “Código deve ser limpo
e eficiente, como uma
lógica direta, para
minimizar os bug.
Código limpo faz bem
apenas uma coisa”
http://www.stroustrup.com/
• http://pt.wikipedia.org/wiki/Bjarne_Stroustrup
BjarneStroustrup
Criador do C++
• “Deve ser limpo e direto”
• “Deve ser legível quem
uma prosa bem escrita”
• http://pt.wikipedia.org/wi
ki/Grady_Booch
Grady Booch
Autor :
Software Engineeringwith Ada
Object-Oriented Analysis and
Design with Applications
“Ele tem teste unitários e
de aceitação, nomes
significativos; ele oferece
apenas uma maneira de
fazer uma tarefa; e possui
poucas dependências”
http://en.wikipedia.org/wik
i/Dave_Thomas_%28Ame
rican_businessman%29
DaveThomas
Fundador OTI,
e padrinho da estrategia Eclipse
Clean coders
• “Parece ter sido escrito
por alguem que se
importa”
• http://www.objectmentor.com
/omTeam/feathers_m.html
• http://en.wikipedia.org/wiki/L
egacy_code
Michael Feaths
Autor:
Working Effectively with LegacyCode
“Efetue todos os testes”
“Sem duplicação de
código”
“Expressa todas as ideias
do projeto que estão no
sistema”
“Minimiza o número de
entidades, como classes,
métodos, e outras do tipo”
http://en.wikipedia.org/wik
i/Ron_Jeffries
Ron Jeffreis
Autor :
Extreme programming installed and
Extreme Programing Adventure in C#
• “Cada rotina que você le
faz o que
• realmente o que você
espera”
http://pt.wikipedia.org/wi
ki/Ward_Cunningham
Ward Cunnigham
Desenvolveu o primeiro wiki.
Pioneiro nos padrões de designe
Extreme Programming.
•Robert C.
Martin
(Uncle Bob)
“Escola do pensamento”
Autor:
Clean Code: A Handbook of Agile
Software Craftsmanship
Agile Software Development: Principles,
Patterns and Practices”
Evite Mapeamento Mental
O programador leitor não deve traduzir
mentalmente os nomes que você escolheu por
outros que ele conheça.
 Ex: (a1, a2, a3)
Mesmo não gerando confusão o programador
tem que traduzir para saber o qual é o significado.
Evite Mapeamento Mental
Há nomes, no universo da escrita de códigos, que
já estão bem integradas pela comunidade de
desenvolvedores, por exemplo:
Variáveis “i” e “j” usadas nas iterações “for”.
Nestes casos, não há motivo para usar “r” ou “x”
NOMES QUE REVELAM
O PROPÓSITO
Sempre devemos priorizar um código que revela a
verdadeira intenção e demostrar a intenção real do
que ele vai fazer:
• Int et // tempo decorrido em segundos (início e final da iteração).
• int tempoDecorridoSegundos;
• int tempoInicioFim;
Cuidados com Similares
USAR COM CUIDADO AS LETRAS “L”, “I” E “O”.
Elas são facilmente confundidas com os numerais
1 (um) e 0 (zero).
NOMES PARECIDOS
Temos que ter cuidado ao usar nomes muito
parecidos pois pode uma má interpretação e
possibilitar ao erro.
• double valorTotalDasRsDoOrcamentoAtual; // receitas
• double valorTotalDasDsDoOrcamentoAtual; // despesas
• double valorTotalDosCsDoOrcamentoAtual; // custos
NOMES PARECIDOS
Possível solução:
Class OrcamentoAtual{
public double getTotalDeReceitas(){
return ...
}
public double getTotalDeDespesas(){
return ...
}
public double getTotalDeCustos(){
return ...
}
}
FAÇA DISTINÇÕES
SIGNIFICATIVAS
Evite nomes comuns, que não agregam valor ao
seu sentido.
• getActiveAccount()
• getActiveAccounts()
• getActiveAccountInfo()
• getActiveAccountData()
Como os programadores deste projeto poderiam
saber qual método chamar? Faça a distinção dos
nomes de uma maneira que o leitor compreenda
suas diferenças.
EVITAR CODIFICAÇÕES
Programadores, codificam demais, convivem com
isso em seu dia-a-dia; mais código só iria trazer
mais problemas, tarefa extra de decifração. Nomes
codificados raramente são impronunciáveis, além
de ser fácil escrevê-los incorretamente.
EVITAR CODIFICAÇÕES
Veja o exemplo, que poderia ser um arquivo XML
para exportação:
• end001_Orc_CadCli.xml
• cep002_Rec_CadFor.xml
Tente fazer algo que representa qual é o seu real
objetivo.
• endereco_orcamento_cadatroCliente_001.xml
• cep_receita_cadastroFornecedor_002.xml
EVITE INFORMAÇÕES
ERRADAS
Cuidado ao usar nomes muito parecidos, é difícil
perceber a pequena diferença entre :
• XUZControllerForEfficientHanlingOfString em um módulo e
• XUZControllerForEfficientStorageOfString em outro.
Ambos os nomes são muito semelhantes e mais
não fazem a mesma coisa, o que pode confundir
os programadores.
USE CONVENÇÕES
Java blueprints:
http://www.oracle.com/technetwork/java/javaee/blueprints/index.html
Pesquise sobre DDD (Domain-Driven Design):
http://domaindrivendesign.org/
Aprenda Bem Orientação a objetos.
OBJETOS E ESTRUTURAS DE
DADOS
Siga a Lei de Demeter:
Cada unidade deve ter apenas conhecimento
limitado sobre as outras unidades: Unidades de
apenas "de perto" relacionado com a unidade
atual.
Cada unidade deve apenas conversar com seus
amigos, não falar com estranhos.
Apenas conversar com seus amigos mais
próximos.
http://en.wikipedia.org/wiki/Law_of_Demeter
USAR NOMES PRONUNCIÁVEIS
Nomeamos variáveis membro, variáveis locais,
métodos, objetos, ou seja, tudo dentro de nosso
código, é bom que esses nomes sejam bem
escolhidos, pois teremos seguramente longas
discussões com outros programadores, analistas
e usuários finais, é bom que os nomes desses
componentes sejam claros e de fácil pronúncia.
.
USAR NOMES PRONUNCIÁVEIS
A esse respeito Martin (2012) ressalta:
“[...] Se não puder pronunciá-lo, não terá como
discutir sobre tal nome sem parecer um idiota. “Bem,
aqui no be cê erre três cê ene tê”, temos um pê esse
zê quê int, viram? Isso importa porque a
programação é uma atividade social”. (MARTIN (1),
2011:22).
EVITE INFORMAÇÕES
ERRADAS
Evitem sempre passar informações que não seja
verdadeiras e que torne o codigo sem sentido e
que desvia do que se deseja.
• accountList //um lista de contas
Não se refira a um grupo de contas
como accountList, a menos que realmente seja
um List. A palavra list (Lista) significa algo
específico para programadores.
• accountGroup ou accounts
USE NOMES PASSÍVEIS DE
BUSCA
Nomes de uma só letra ou numéricos possuem um
problema em particular por não ser fácil localizá-
los ao longo do texto. O tamanho de um nome
deve ser proporcional ao tamanho do escopo.
Nomes de uma letra só somente deveriam ser
usados em métodos pequenos.
USE NOMES PASSÍVEIS DE
BUSCA
Escopos de uma linha ou duas não geram
mapeamento mental.
Se uma variável ou constante pode ser vista ou
usada em vários lugares dentro do código, é
imperativo atribuí-la um nome fácil para busca-lo
A NOTAÇÃO HÚNGARA
A notação Húngara visa a facilitar o
reconhecimento do tipo de variável num programa
colocando ao nome um sufixo descrevendo seu
tipo.
• Exemplo: S ao invês de String
A NOTAÇÃO HÚNGARA
Com o as novas linguagens, técnicas nelas
utilizadas e testes automatizados, a notação
húngara se mostra desnecessária. Não
precisamos preocupar com o redução dos nome
das variáveis é melhor usar nomes siginificativos.
• PhoneNumber phoneNumber;
CLASSES
Devem ser pequenas
Ter uma única responsabilidade (SRP)
Classe tem que ser organizada em variáveis e
métodos
Sempre priorizar o encapsulamento.
Nomes de classes normalmente devem ser
representadas como substantivos.
CLASSES
Class Pedido {
void emitirPedido();
void gerarNotaFiscal();
}
class Pedido {
void emitirPedido();
}
Class NotaFiscal {
void gerarNotaFiscal();
}
SINGLE RESPONSIBILITY
PRINCIPLE (SRP)
O princípio da responsabilidade única afirma que
cada classe deve ter uma única responsabilidade,
e essa responsabilidade deve ser totalmente
encapsulado pela classe.
Todos os seus serviços devem ser estreitamente
alinhados com essa responsabilidade.
http://en.wikipedia.org/wiki/Single_responsibility_principle
FUNÇÕES (MÉTODOS)
Devem ser pequenas.
Ter uma única responsabilidade (SRP).
Classe tem que ser organizada em variáveis e
métodos.
Sempre priorizar o encapsulamento.
Funções devem ser verbos.
Evite repetição (DRY – Don’t Repeat Yourself)
FUNÇÕES (MÉTODOS)
Prefira poucos parâmetros
Trate erros antes de apresentar ao usuário
(try/catch)
Se atente a identação.
Nomes de métodos normalmente devem ser
representadas como verbos.
MÉTODOS NÃO DEVE TER MUITOS
PARÂMETROS:
Se tiver que fazer:
• public save (String name, String email, Integer age)
Faça:
• public save (Person person)
COMENTÁRIOS
Se o código estiver bem explicado, comentário não
é necessário.
Para controlar versão de código não use
comentários, prefira controles de versões (SVN,
GIT)
Se tiver que explicar seu código, refratore-o (Deixe
ele limpo)
Comentários podem não ser atualizado, podendo
“mentir” sobre a responsabilidade do código
Não misture várias linguagem (Ex: html, texto, etc)
FORMATAÇÃO
Classes menores são melhor entendíveis
Mantenha a indentação
Limite suas linhas (120 caracteres – uncle bob)
Combine com a equipe qual será a formatação
Mantenha contextos relacionados próximos
TRATAMENTO DE
ERROS
Crie primeiro sua estrutura try-catch-finally
Sempre lance exceções ao invés de retornar um
erro para o usuário.
Forneça exceções com contexto.
Não retorne null
Não passe null
Crie testes
Para teste use TDD (Test-driven development)
Resumindo,
Um código limpo é:
 Deve ser eficiente.
 Deve ter uma lógica direta que dificulte o encobrimento de bugs.
 Deve ter dependências mínimas.
 Deve facilitar a manutenção e o tratamento de erro.
 Deve ser legível.
 Não deve confundir o desenvolvedor.
 Deve ter testes unitários e de aceitação.
 Deve ter nomes significativos.
 Deve possibilitar apenas uma maneira, e não várias, de se fazer uma tarefa.
 Deve fazer o que o programador esperava que fizesse.
Código limpo, basicamente é ter um refinamento
sucessivo.
Sempre pensando em que o código pode ser
melhor, mais legível e funcional.
Siga sempre a ideia de que somos autores de
sistemas.
“ Ao escrever um código fonte temos que pensarmos
como autores e que o leitor terá a mesma sensação
ao ver um código limpo, que você fará, de estar
lendo um bom livro.”
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everis

Mais conteúdo relacionado

Mais procurados

Mais procurados (19)

Design Patterns - Com Java
Design Patterns  - Com JavaDesign Patterns  - Com Java
Design Patterns - Com Java
 
Paradigmas de Programação - Imperativo, Orientado a Objetos e Funcional
Paradigmas de Programação - Imperativo, Orientado a Objetos e FuncionalParadigmas de Programação - Imperativo, Orientado a Objetos e Funcional
Paradigmas de Programação - Imperativo, Orientado a Objetos e Funcional
 
O Programador Pragmático
O Programador PragmáticoO Programador Pragmático
O Programador Pragmático
 
DDD linguagem ubiqua + codigo expressivo
DDD  linguagem ubiqua + codigo expressivoDDD  linguagem ubiqua + codigo expressivo
DDD linguagem ubiqua + codigo expressivo
 
Boas praticas em_desenvolvimento_de_software
Boas praticas em_desenvolvimento_de_softwareBoas praticas em_desenvolvimento_de_software
Boas praticas em_desenvolvimento_de_software
 
C a linguagem de programação
C   a linguagem de programaçãoC   a linguagem de programação
C a linguagem de programação
 
Análise de sistemas oo 1
Análise de sistemas oo   1Análise de sistemas oo   1
Análise de sistemas oo 1
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In Tuba
 
Introdução ao paradigma imperativo
Introdução ao paradigma imperativoIntrodução ao paradigma imperativo
Introdução ao paradigma imperativo
 
Java aula 06
Java aula 06Java aula 06
Java aula 06
 
Java aula 04
Java aula 04Java aula 04
Java aula 04
 
Java aula 03
Java aula 03Java aula 03
Java aula 03
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Aula04
Aula04Aula04
Aula04
 
Design patterns de uma vez por todas
Design patterns de uma vez por todasDesign patterns de uma vez por todas
Design patterns de uma vez por todas
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para Linux
 
Apresentação java
Apresentação javaApresentação java
Apresentação java
 
P01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhorP01 - Como ser um desenvolvedor melhor
P01 - Como ser um desenvolvedor melhor
 
Conceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoConceitos Fundamentais de Programacao
Conceitos Fundamentais de Programacao
 

Semelhante a Clean code @rogeriofontes-techfriday-everis

Profissao-programador-praticas-para-melhoria-continua-unimonte-outubro-2013
Profissao-programador-praticas-para-melhoria-continua-unimonte-outubro-2013Profissao-programador-praticas-para-melhoria-continua-unimonte-outubro-2013
Profissao-programador-praticas-para-melhoria-continua-unimonte-outubro-2013Gabriel Rubens
 
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Gilmar PSL
 
Projeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.SProjeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.SThoughtworks
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasRafael Chinelato Del Nero
 
Programação Pragmática
Programação PragmáticaProgramação Pragmática
Programação Pragmáticaelliando dias
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshopguestd37c23
 
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...Rodrigo Vieira
 
Php Conf08 Refactoring
Php Conf08 RefactoringPhp Conf08 Refactoring
Php Conf08 RefactoringWildtech
 
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...Developer Academy
 

Semelhante a Clean code @rogeriofontes-techfriday-everis (20)

Profissao-programador-praticas-para-melhoria-continua-unimonte-outubro-2013
Profissao-programador-praticas-para-melhoria-continua-unimonte-outubro-2013Profissao-programador-praticas-para-melhoria-continua-unimonte-outubro-2013
Profissao-programador-praticas-para-melhoria-continua-unimonte-outubro-2013
 
Clean code
Clean codeClean code
Clean code
 
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
 
Projeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.SProjeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.S
 
O que é ser um bom programador?
O que é ser um bom programador?O que é ser um bom programador?
O que é ser um bom programador?
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivas
 
FC-Logic
FC-LogicFC-Logic
FC-Logic
 
Programação Pragmática
Programação PragmáticaProgramação Pragmática
Programação Pragmática
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshop
 
Clean Code
Clean CodeClean Code
Clean Code
 
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...
Aspectos do aprendizado do paradigma orientado a objetos por programadores pr...
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
Php Conf08 Refactoring
Php Conf08 RefactoringPhp Conf08 Refactoring
Php Conf08 Refactoring
 
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...
Apresentação do Workshop BDD (Desenvolvimento Guiado por Comportamento) com V...
 
Clean code
Clean codeClean code
Clean code
 
Clean Code na prática
Clean Code na práticaClean Code na prática
Clean Code na prática
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Clean Code
Clean CodeClean Code
Clean Code
 
O que é código bonito?
O que é código bonito?O que é código bonito?
O que é código bonito?
 

Mais de Rogerio Fontes

Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaRogerio Fontes
 
Uaijug ADF - spring boot - microservice - Introdução
Uaijug ADF - spring boot - microservice - IntroduçãoUaijug ADF - spring boot - microservice - Introdução
Uaijug ADF - spring boot - microservice - IntroduçãoRogerio Fontes
 
Mongodb praquer-usar-uaijugcloudday2014
Mongodb praquer-usar-uaijugcloudday2014Mongodb praquer-usar-uaijugcloudday2014
Mongodb praquer-usar-uaijugcloudday2014Rogerio Fontes
 
Apresentação wild fly-semrevisao
Apresentação wild fly-semrevisaoApresentação wild fly-semrevisao
Apresentação wild fly-semrevisaoRogerio Fontes
 
Palestra urutai-mobile
Palestra urutai-mobilePalestra urutai-mobile
Palestra urutai-mobileRogerio Fontes
 
Empreender nointerior pressystem
Empreender nointerior pressystemEmpreender nointerior pressystem
Empreender nointerior pressystemRogerio Fontes
 

Mais de Rogerio Fontes (6)

Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis Uberlândia
 
Uaijug ADF - spring boot - microservice - Introdução
Uaijug ADF - spring boot - microservice - IntroduçãoUaijug ADF - spring boot - microservice - Introdução
Uaijug ADF - spring boot - microservice - Introdução
 
Mongodb praquer-usar-uaijugcloudday2014
Mongodb praquer-usar-uaijugcloudday2014Mongodb praquer-usar-uaijugcloudday2014
Mongodb praquer-usar-uaijugcloudday2014
 
Apresentação wild fly-semrevisao
Apresentação wild fly-semrevisaoApresentação wild fly-semrevisao
Apresentação wild fly-semrevisao
 
Palestra urutai-mobile
Palestra urutai-mobilePalestra urutai-mobile
Palestra urutai-mobile
 
Empreender nointerior pressystem
Empreender nointerior pressystemEmpreender nointerior pressystem
Empreender nointerior pressystem
 

Clean code @rogeriofontes-techfriday-everis

  • 1. Rogério Fontes @rogeriofontes http://rogeriofontes.inf.br Arquiteto Java. Apaixonado em código e formas ágeis de criá-los, Lider do UaiJUG (Grupo de Usuários do Triângulo Mineiro, Lider Tecnico Everis. Clean Code
  • 2. Agenda O que é um código limpo? O que é um código ruim? Quanto custa um código ruim? O que se fala de código limpo? Como deve ser um código limpo. Algumas regras para melhorar seu código. Equipe
  • 3. Tenho um problema para resolver, mas o tempo está curto. “Bora” resolver?
  • 4. Funciona, mais é viável?
  • 5. Funciona, mais é viável?
  • 6. Ao resolver problemas e entregar solução temos que pensar na melhor forma de faze-lo, não simplesmente resolver momentaneamente.
  • 7. Quando vemos um problema ou uma “gambiara” temos a responsabilidade de arrumar. Temos que ter em mente a regra do escoteiro.
  • 8. Regra do escoteiro “Você deve sempre deixar o lugar mais limpo do que encontrou”
  • 10. Clean code O que representa um código limpo: Eficiencia Única responsabilidade
  • 11. Clean code O que representa um código ruim: Que não é legível a outros programadores Multiplica o tempo gasto ao codificar.
  • 12. Código ruim Porque fazemos?  Estava com pressa?  Seu chefe cobrando a toda hora (Gerente tele- sena)?  Cansado?  Estressado?  Cronograma estourado?
  • 14. Voltando ao Limpo. O que se fala sobre código limpo:
  • 15. Clean coders • “Código deve ser limpo e eficiente, como uma lógica direta, para minimizar os bug. Código limpo faz bem apenas uma coisa” http://www.stroustrup.com/ • http://pt.wikipedia.org/wiki/Bjarne_Stroustrup BjarneStroustrup Criador do C++ • “Deve ser limpo e direto” • “Deve ser legível quem uma prosa bem escrita” • http://pt.wikipedia.org/wi ki/Grady_Booch Grady Booch Autor : Software Engineeringwith Ada Object-Oriented Analysis and Design with Applications “Ele tem teste unitários e de aceitação, nomes significativos; ele oferece apenas uma maneira de fazer uma tarefa; e possui poucas dependências” http://en.wikipedia.org/wik i/Dave_Thomas_%28Ame rican_businessman%29 DaveThomas Fundador OTI, e padrinho da estrategia Eclipse
  • 16. Clean coders • “Parece ter sido escrito por alguem que se importa” • http://www.objectmentor.com /omTeam/feathers_m.html • http://en.wikipedia.org/wiki/L egacy_code Michael Feaths Autor: Working Effectively with LegacyCode “Efetue todos os testes” “Sem duplicação de código” “Expressa todas as ideias do projeto que estão no sistema” “Minimiza o número de entidades, como classes, métodos, e outras do tipo” http://en.wikipedia.org/wik i/Ron_Jeffries Ron Jeffreis Autor : Extreme programming installed and Extreme Programing Adventure in C# • “Cada rotina que você le faz o que • realmente o que você espera” http://pt.wikipedia.org/wi ki/Ward_Cunningham Ward Cunnigham Desenvolveu o primeiro wiki. Pioneiro nos padrões de designe Extreme Programming.
  • 17. •Robert C. Martin (Uncle Bob) “Escola do pensamento” Autor: Clean Code: A Handbook of Agile Software Craftsmanship Agile Software Development: Principles, Patterns and Practices”
  • 18. Evite Mapeamento Mental O programador leitor não deve traduzir mentalmente os nomes que você escolheu por outros que ele conheça.  Ex: (a1, a2, a3) Mesmo não gerando confusão o programador tem que traduzir para saber o qual é o significado.
  • 19. Evite Mapeamento Mental Há nomes, no universo da escrita de códigos, que já estão bem integradas pela comunidade de desenvolvedores, por exemplo: Variáveis “i” e “j” usadas nas iterações “for”. Nestes casos, não há motivo para usar “r” ou “x”
  • 20. NOMES QUE REVELAM O PROPÓSITO Sempre devemos priorizar um código que revela a verdadeira intenção e demostrar a intenção real do que ele vai fazer: • Int et // tempo decorrido em segundos (início e final da iteração). • int tempoDecorridoSegundos; • int tempoInicioFim;
  • 21. Cuidados com Similares USAR COM CUIDADO AS LETRAS “L”, “I” E “O”. Elas são facilmente confundidas com os numerais 1 (um) e 0 (zero).
  • 22. NOMES PARECIDOS Temos que ter cuidado ao usar nomes muito parecidos pois pode uma má interpretação e possibilitar ao erro. • double valorTotalDasRsDoOrcamentoAtual; // receitas • double valorTotalDasDsDoOrcamentoAtual; // despesas • double valorTotalDosCsDoOrcamentoAtual; // custos
  • 23. NOMES PARECIDOS Possível solução: Class OrcamentoAtual{ public double getTotalDeReceitas(){ return ... } public double getTotalDeDespesas(){ return ... } public double getTotalDeCustos(){ return ... } }
  • 24. FAÇA DISTINÇÕES SIGNIFICATIVAS Evite nomes comuns, que não agregam valor ao seu sentido. • getActiveAccount() • getActiveAccounts() • getActiveAccountInfo() • getActiveAccountData() Como os programadores deste projeto poderiam saber qual método chamar? Faça a distinção dos nomes de uma maneira que o leitor compreenda suas diferenças.
  • 25. EVITAR CODIFICAÇÕES Programadores, codificam demais, convivem com isso em seu dia-a-dia; mais código só iria trazer mais problemas, tarefa extra de decifração. Nomes codificados raramente são impronunciáveis, além de ser fácil escrevê-los incorretamente.
  • 26. EVITAR CODIFICAÇÕES Veja o exemplo, que poderia ser um arquivo XML para exportação: • end001_Orc_CadCli.xml • cep002_Rec_CadFor.xml Tente fazer algo que representa qual é o seu real objetivo. • endereco_orcamento_cadatroCliente_001.xml • cep_receita_cadastroFornecedor_002.xml
  • 27. EVITE INFORMAÇÕES ERRADAS Cuidado ao usar nomes muito parecidos, é difícil perceber a pequena diferença entre : • XUZControllerForEfficientHanlingOfString em um módulo e • XUZControllerForEfficientStorageOfString em outro. Ambos os nomes são muito semelhantes e mais não fazem a mesma coisa, o que pode confundir os programadores.
  • 28. USE CONVENÇÕES Java blueprints: http://www.oracle.com/technetwork/java/javaee/blueprints/index.html Pesquise sobre DDD (Domain-Driven Design): http://domaindrivendesign.org/ Aprenda Bem Orientação a objetos.
  • 29. OBJETOS E ESTRUTURAS DE DADOS Siga a Lei de Demeter: Cada unidade deve ter apenas conhecimento limitado sobre as outras unidades: Unidades de apenas "de perto" relacionado com a unidade atual. Cada unidade deve apenas conversar com seus amigos, não falar com estranhos. Apenas conversar com seus amigos mais próximos. http://en.wikipedia.org/wiki/Law_of_Demeter
  • 30. USAR NOMES PRONUNCIÁVEIS Nomeamos variáveis membro, variáveis locais, métodos, objetos, ou seja, tudo dentro de nosso código, é bom que esses nomes sejam bem escolhidos, pois teremos seguramente longas discussões com outros programadores, analistas e usuários finais, é bom que os nomes desses componentes sejam claros e de fácil pronúncia. .
  • 31. USAR NOMES PRONUNCIÁVEIS A esse respeito Martin (2012) ressalta: “[...] Se não puder pronunciá-lo, não terá como discutir sobre tal nome sem parecer um idiota. “Bem, aqui no be cê erre três cê ene tê”, temos um pê esse zê quê int, viram? Isso importa porque a programação é uma atividade social”. (MARTIN (1), 2011:22).
  • 32. EVITE INFORMAÇÕES ERRADAS Evitem sempre passar informações que não seja verdadeiras e que torne o codigo sem sentido e que desvia do que se deseja. • accountList //um lista de contas Não se refira a um grupo de contas como accountList, a menos que realmente seja um List. A palavra list (Lista) significa algo específico para programadores. • accountGroup ou accounts
  • 33. USE NOMES PASSÍVEIS DE BUSCA Nomes de uma só letra ou numéricos possuem um problema em particular por não ser fácil localizá- los ao longo do texto. O tamanho de um nome deve ser proporcional ao tamanho do escopo. Nomes de uma letra só somente deveriam ser usados em métodos pequenos.
  • 34. USE NOMES PASSÍVEIS DE BUSCA Escopos de uma linha ou duas não geram mapeamento mental. Se uma variável ou constante pode ser vista ou usada em vários lugares dentro do código, é imperativo atribuí-la um nome fácil para busca-lo
  • 35. A NOTAÇÃO HÚNGARA A notação Húngara visa a facilitar o reconhecimento do tipo de variável num programa colocando ao nome um sufixo descrevendo seu tipo. • Exemplo: S ao invês de String
  • 36. A NOTAÇÃO HÚNGARA Com o as novas linguagens, técnicas nelas utilizadas e testes automatizados, a notação húngara se mostra desnecessária. Não precisamos preocupar com o redução dos nome das variáveis é melhor usar nomes siginificativos. • PhoneNumber phoneNumber;
  • 37. CLASSES Devem ser pequenas Ter uma única responsabilidade (SRP) Classe tem que ser organizada em variáveis e métodos Sempre priorizar o encapsulamento. Nomes de classes normalmente devem ser representadas como substantivos.
  • 38. CLASSES Class Pedido { void emitirPedido(); void gerarNotaFiscal(); } class Pedido { void emitirPedido(); } Class NotaFiscal { void gerarNotaFiscal(); }
  • 39. SINGLE RESPONSIBILITY PRINCIPLE (SRP) O princípio da responsabilidade única afirma que cada classe deve ter uma única responsabilidade, e essa responsabilidade deve ser totalmente encapsulado pela classe. Todos os seus serviços devem ser estreitamente alinhados com essa responsabilidade. http://en.wikipedia.org/wiki/Single_responsibility_principle
  • 40. FUNÇÕES (MÉTODOS) Devem ser pequenas. Ter uma única responsabilidade (SRP). Classe tem que ser organizada em variáveis e métodos. Sempre priorizar o encapsulamento. Funções devem ser verbos. Evite repetição (DRY – Don’t Repeat Yourself)
  • 41. FUNÇÕES (MÉTODOS) Prefira poucos parâmetros Trate erros antes de apresentar ao usuário (try/catch) Se atente a identação. Nomes de métodos normalmente devem ser representadas como verbos.
  • 42. MÉTODOS NÃO DEVE TER MUITOS PARÂMETROS: Se tiver que fazer: • public save (String name, String email, Integer age) Faça: • public save (Person person)
  • 43. COMENTÁRIOS Se o código estiver bem explicado, comentário não é necessário. Para controlar versão de código não use comentários, prefira controles de versões (SVN, GIT) Se tiver que explicar seu código, refratore-o (Deixe ele limpo) Comentários podem não ser atualizado, podendo “mentir” sobre a responsabilidade do código Não misture várias linguagem (Ex: html, texto, etc)
  • 44. FORMATAÇÃO Classes menores são melhor entendíveis Mantenha a indentação Limite suas linhas (120 caracteres – uncle bob) Combine com a equipe qual será a formatação Mantenha contextos relacionados próximos
  • 45. TRATAMENTO DE ERROS Crie primeiro sua estrutura try-catch-finally Sempre lance exceções ao invés de retornar um erro para o usuário. Forneça exceções com contexto. Não retorne null Não passe null
  • 46. Crie testes Para teste use TDD (Test-driven development)
  • 47. Resumindo, Um código limpo é:  Deve ser eficiente.  Deve ter uma lógica direta que dificulte o encobrimento de bugs.  Deve ter dependências mínimas.  Deve facilitar a manutenção e o tratamento de erro.  Deve ser legível.  Não deve confundir o desenvolvedor.  Deve ter testes unitários e de aceitação.  Deve ter nomes significativos.  Deve possibilitar apenas uma maneira, e não várias, de se fazer uma tarefa.  Deve fazer o que o programador esperava que fizesse.
  • 48. Código limpo, basicamente é ter um refinamento sucessivo. Sempre pensando em que o código pode ser melhor, mais legível e funcional. Siga sempre a ideia de que somos autores de sistemas.
  • 49. “ Ao escrever um código fonte temos que pensarmos como autores e que o leitor terá a mesma sensação ao ver um código limpo, que você fará, de estar lendo um bom livro.”

Notas do Editor

  1. Bjarne Stroustrup Criador do C++ Grady Booch Autor : Software Engineering with Ada Object-Oriented Analysis and Design with Applications Dave Thomas Fundador OTI , e padrinho da estrategia Eclipse
  2. Michael Feaths Autor: Working Effectively with Legacy Code Ron Jeffreis Autor : Extreme programming installed and Extreme Programing Adventure in C# Ward Cunnigham Desenvolveu o primeiro wiki. Pioneiro nos padrões de design e Extreme Programming