SlideShare uma empresa Scribd logo
1 de 35
Código Limpo
HENRIQUE SMOCO
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
Definição Código Limpo
 Funciona
 É facil de ler
 Simples de entender
 Eficiente (sem rodeios)
 Fácil de estender
 Limpo (alguém se importou)
Métrica de Código Limpo
“Qualquer tolo pode escrever
código que um computador
pode entender. Bons
programadores escrevem
código que humanos podem
entender.”
MARTIN FOWLER
Como escrever melhor?
Escreva para os outros
 Escreva o código como se a próxima pessoa a dar
manutenção fosse um psicopata violento que sabe
onde você mora!
Regra do escoteiro
 Quando levantar acampamento, deixe o local mais
limpo do que estava quando você chegou.
Se importe
 Nem que seja só acertar a formatação
 Evite a síndrome da janela quebrada
Não reinvente a roda
 Antes de escrever, pergunte se alguém já o fez ou se
existe uma lib que faz o que é preciso
 Menos é mais!
Estude, pergunte,
compartilhe
Código Sujo
CODE SMELLS
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
Código Limpo
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
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
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;
}
Use Nomes Significativos
public List<Cell> getCelulasMarcadas() {
List<Cell> celulasMarcadas = new ArrayList<>();
for (Cell cell : gameBoard)
if (cell.isMarcada()) {
celulasMarcadas.add(cell);
}
return celulasMarcadas;
}
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
Métodos Limpos
public void printaNomeUsuario(int codigoUsuario) {
Usuario usuario = getUsuario(codigoUsuario);
if (isUsuarioExistente(usuario)) {
printaNoConsole(usuario.getNome());
}
}
private Usuario getUsuario(int codigoUsuario) {
return dao.getUsuario(codigoUsuario);
}
private boolean isUsuarioExistente(Usuario usuario) {
return usuario != null;
}
private void printaNoConsole(String mensagem) {
system.out.println(mensagem);
}
Métodos Limpos
public void printaNomeUsuario(int codigoUsuario) {
Usuario usuario = getUsuario(codigoUsuario);
if (isUsuarioExistente(usuario)) {
printaNoConsole(usuario.getNome());
}
}
private Usuario getUsuario(int codigoUsuario) {
return dao.getUsuario(codigoUsuario);
}
private boolean isUsuarioExistente(Usuario usuario) {
return usuario != null;
}
private void printaNoConsole(String mensagem) {
system.out.println(mensagem);
}
Métodos Limpos
public void printaNomeUsuario(int codigoUsuario) {
Usuario usuario = getUsuario(codigoUsuario);
if (isUsuarioExistente(usuario)) {
printaNoConsole(usuario.getNome());
}
}
private Usuario getUsuario(int codigoUsuario) {
return dao.getUsuario(codigoUsuario);
}
private boolean isUsuarioExistente(Usuario usuario) {
return usuario != null;
}
private void printaNoConsole(String mensagem) {
system.out.println(mensagem);
}
Métodos Limpos
public void printaNomeUsuario(int codigoUsuario) {
Usuario usuario = getUsuario(codigoUsuario);
if (isUsuarioExistente(usuario)) {
printaNoConsole(usuario.getNome());
}
}
private Usuario getUsuario(int codigoUsuario) {
return dao.getUsuario(codigoUsuario);
}
private boolean isUsuarioExistente(Usuario usuario) {
return usuario != null;
}
private void printaNoConsole(String mensagem) {
system.out.println(mensagem);
}
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();
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);
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())
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
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++;
}
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);
Tratamento de Erros Limpo
 Ou você faz log ou throw, nunca os dois
 Use log4j (ou outros), System.out é mau
 Prefira RuntimeException
Tratamento de Erros Limpo
public void delete(Page page) {
try {
deletePageAndAllReferences(page);
} catch (Exception e) {
logger.log(e.getMessage());
}
}
private void deletePageAndAllReferences(Page page) throws
Exception {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
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();
}
}
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
Código Limpo
DEPENDE DE VOCÊ TAMBÉM
Código Limpo

Mais conteúdo relacionado

Mais procurados

Algoritmos e Visualg parte 1
Algoritmos e Visualg   parte 1Algoritmos e Visualg   parte 1
Algoritmos e Visualg parte 1Marcio Pinto
 
Apostila de Introdução aos Algoritmos - usando o Visualg
Apostila de Introdução aos Algoritmos - usando o VisualgApostila de Introdução aos Algoritmos - usando o Visualg
Apostila de Introdução aos Algoritmos - usando o VisualgRegis Magalhães
 
6. estruturas de controlo de fluxo
6. estruturas de controlo de fluxo6. estruturas de controlo de fluxo
6. estruturas de controlo de fluxoEugenio Caetano
 
03 - Introdução a lógica de programação parte 3 - v1.1
03 - Introdução a lógica de programação parte 3 - v1.103 - Introdução a lógica de programação parte 3 - v1.1
03 - Introdução a lógica de programação parte 3 - v1.1César Augusto Pessôa
 
Princípios de projeto e boas práticas de programação em Java - Márcio Torres
Princípios de projeto e boas práticas de programação em Java - Márcio TorresPrincípios de projeto e boas práticas de programação em Java - Márcio Torres
Princípios de projeto e boas práticas de programação em Java - Márcio TorresTchelinux
 
Introdução a programação
Introdução a programaçãoIntrodução a programação
Introdução a programaçãoEdu Queiroz
 
Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência JavaMario Jorge Pereira
 
Lógica de programação com visu alg
Lógica de programação com visu algLógica de programação com visu alg
Lógica de programação com visu algLeandro Santos
 
Expressões idiomáticas do python
Expressões idiomáticas do pythonExpressões idiomáticas do python
Expressões idiomáticas do pythonFilipe Ximenes
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In TubaRafael Paz
 

Mais procurados (20)

Clean code
Clean codeClean code
Clean code
 
Algoritmos e Visualg parte 1
Algoritmos e Visualg   parte 1Algoritmos e Visualg   parte 1
Algoritmos e Visualg parte 1
 
Apostila de Introdução aos Algoritmos - usando o Visualg
Apostila de Introdução aos Algoritmos - usando o VisualgApostila de Introdução aos Algoritmos - usando o Visualg
Apostila de Introdução aos Algoritmos - usando o Visualg
 
Aula 06
Aula 06Aula 06
Aula 06
 
6. estruturas de controlo de fluxo
6. estruturas de controlo de fluxo6. estruturas de controlo de fluxo
6. estruturas de controlo de fluxo
 
03 - Introdução a lógica de programação parte 3 - v1.1
03 - Introdução a lógica de programação parte 3 - v1.103 - Introdução a lógica de programação parte 3 - v1.1
03 - Introdução a lógica de programação parte 3 - v1.1
 
Princípios de projeto e boas práticas de programação em Java - Márcio Torres
Princípios de projeto e boas práticas de programação em Java - Márcio TorresPrincípios de projeto e boas práticas de programação em Java - Márcio Torres
Princípios de projeto e boas práticas de programação em Java - Márcio Torres
 
Introdução a programação
Introdução a programaçãoIntrodução a programação
Introdução a programação
 
Código Limpo
Código LimpoCódigo Limpo
Código Limpo
 
Codigo limpo
Codigo limpoCodigo limpo
Codigo limpo
 
Guia rapido java v2
Guia rapido java v2Guia rapido java v2
Guia rapido java v2
 
Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência Java
 
Comandos em python
Comandos em pythonComandos em python
Comandos em python
 
Etapas da programação
Etapas da programaçãoEtapas da programação
Etapas da programação
 
Lógica de programação
Lógica de programaçãoLógica de programação
Lógica de programação
 
Aula 07 - Visualg e Pseudocódigo
Aula 07 - Visualg e PseudocódigoAula 07 - Visualg e Pseudocódigo
Aula 07 - Visualg e Pseudocódigo
 
Apostila sobre o Visualg
Apostila sobre o VisualgApostila sobre o Visualg
Apostila sobre o Visualg
 
Lógica de programação com visu alg
Lógica de programação com visu algLógica de programação com visu alg
Lógica de programação com visu alg
 
Expressões idiomáticas do python
Expressões idiomáticas do pythonExpressões idiomáticas do python
Expressões idiomáticas do python
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In Tuba
 

Destaque

Образовательный центр для тюрем земли Берлин
Образовательный центр для тюрем земли БерлинОбразовательный центр для тюрем земли Берлин
Образовательный центр для тюрем земли БерлинVadim Karastelev
 
Progressive Homes_Reference
Progressive Homes_ReferenceProgressive Homes_Reference
Progressive Homes_ReferenceMarek ?up
 
Общественный контроль: содержание и планирование работ
Общественный контроль: содержание и планирование работОбщественный контроль: содержание и планирование работ
Общественный контроль: содержание и планирование работVadim Karastelev
 
18 los valores en la institucion
18 los valores en la  institucion18 los valores en la  institucion
18 los valores en la institucioncastillos22
 
Tokopedia & Google Drive
Tokopedia & Google DriveTokopedia & Google Drive
Tokopedia & Google DriveRezaSanjaya98
 
BTEC NATIONAL CERTIFICATE ENGINEERING
BTEC NATIONAL CERTIFICATE ENGINEERINGBTEC NATIONAL CERTIFICATE ENGINEERING
BTEC NATIONAL CERTIFICATE ENGINEERINGLee Davies
 
05 coordinación concreción curricular transversalidad ep
05 coordinación concreción curricular transversalidad ep05 coordinación concreción curricular transversalidad ep
05 coordinación concreción curricular transversalidad epNico Morales Bru
 
Rembrandt, Grotius and Menasseh: Visuality and Religious Toleration
Rembrandt, Grotius and Menasseh: Visuality and Religious TolerationRembrandt, Grotius and Menasseh: Visuality and Religious Toleration
Rembrandt, Grotius and Menasseh: Visuality and Religious Tolerationsussexcih
 
Mode d'emploi de bcdi / E-sidoc
Mode d'emploi de bcdi / E-sidocMode d'emploi de bcdi / E-sidoc
Mode d'emploi de bcdi / E-sidocBernos M.
 
Pensar y hacer la seguridad con las escuelas y con los barrios. Claves concep...
Pensar y hacer la seguridad con las escuelas y con los barrios. Claves concep...Pensar y hacer la seguridad con las escuelas y con los barrios. Claves concep...
Pensar y hacer la seguridad con las escuelas y con los barrios. Claves concep...María Ernestina ALONSO
 

Destaque (15)

Образовательный центр для тюрем земли Берлин
Образовательный центр для тюрем земли БерлинОбразовательный центр для тюрем земли Берлин
Образовательный центр для тюрем земли Берлин
 
Padres eficaces
Padres eficacesPadres eficaces
Padres eficaces
 
Progressive Homes_Reference
Progressive Homes_ReferenceProgressive Homes_Reference
Progressive Homes_Reference
 
PDFC-
PDFC-PDFC-
PDFC-
 
1.03416062
1.034160621.03416062
1.03416062
 
Общественный контроль: содержание и планирование работ
Общественный контроль: содержание и планирование работОбщественный контроль: содержание и планирование работ
Общественный контроль: содержание и планирование работ
 
18 los valores en la institucion
18 los valores en la  institucion18 los valores en la  institucion
18 los valores en la institucion
 
Tokopedia & Google Drive
Tokopedia & Google DriveTokopedia & Google Drive
Tokopedia & Google Drive
 
BTEC NATIONAL CERTIFICATE ENGINEERING
BTEC NATIONAL CERTIFICATE ENGINEERINGBTEC NATIONAL CERTIFICATE ENGINEERING
BTEC NATIONAL CERTIFICATE ENGINEERING
 
05 coordinación concreción curricular transversalidad ep
05 coordinación concreción curricular transversalidad ep05 coordinación concreción curricular transversalidad ep
05 coordinación concreción curricular transversalidad ep
 
Rembrandt, Grotius and Menasseh: Visuality and Religious Toleration
Rembrandt, Grotius and Menasseh: Visuality and Religious TolerationRembrandt, Grotius and Menasseh: Visuality and Religious Toleration
Rembrandt, Grotius and Menasseh: Visuality and Religious Toleration
 
You can buy time.
You can buy time.You can buy time.
You can buy time.
 
Tool: Institutional pressures on business
Tool: Institutional pressures on businessTool: Institutional pressures on business
Tool: Institutional pressures on business
 
Mode d'emploi de bcdi / E-sidoc
Mode d'emploi de bcdi / E-sidocMode d'emploi de bcdi / E-sidoc
Mode d'emploi de bcdi / E-sidoc
 
Pensar y hacer la seguridad con las escuelas y con los barrios. Claves concep...
Pensar y hacer la seguridad con las escuelas y con los barrios. Claves concep...Pensar y hacer la seguridad con las escuelas y con los barrios. Claves concep...
Pensar y hacer la seguridad con las escuelas y con los barrios. Claves concep...
 

Semelhante a Código Limpo

Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisRogerio Fontes
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
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
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfAula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfEizoKato
 
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfAula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfEizoKato
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Luís Cobucci
 

Semelhante a Código Limpo (20)

Clean code
Clean codeClean code
Clean code
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everis
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
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
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
O que é código bonito?
O que é código bonito?O que é código bonito?
O que é código bonito?
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfAula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
 
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdfAula 01 Logica de Programacao - Logica Matematica 1.pdf
Aula 01 Logica de Programacao - Logica Matematica 1.pdf
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Java - Primeiros passos
Java - Primeiros passosJava - Primeiros passos
Java - Primeiros passos
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Clean Code
Clean CodeClean Code
Clean Code
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
Algoritmo
AlgoritmoAlgoritmo
Algoritmo
 

Código Limpo

  • 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)
  • 5. “Qualquer tolo pode escrever código que um computador pode entender. Bons programadores escrevem código que humanos podem entender.” MARTIN FOWLER
  • 7. Escreva para os outros  Escreva o código como se a próxima pessoa a dar manutenção fosse um psicopata violento que sabe onde você mora!
  • 8. Regra do escoteiro  Quando levantar acampamento, deixe o local mais limpo do que estava quando você chegou.
  • 9. Se importe  Nem que seja só acertar a formatação  Evite a síndrome da janela quebrada
  • 10. Não reinvente a roda  Antes de escrever, pergunte se alguém já o fez ou se existe uma lib que faz o que é preciso  Menos é mais!
  • 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
  • 20. Métodos Limpos public void printaNomeUsuario(int codigoUsuario) { Usuario usuario = getUsuario(codigoUsuario); if (isUsuarioExistente(usuario)) { printaNoConsole(usuario.getNome()); } } private Usuario getUsuario(int codigoUsuario) { return dao.getUsuario(codigoUsuario); } private boolean isUsuarioExistente(Usuario usuario) { return usuario != null; } private void printaNoConsole(String mensagem) { system.out.println(mensagem); }
  • 21. Métodos Limpos public void printaNomeUsuario(int codigoUsuario) { Usuario usuario = getUsuario(codigoUsuario); if (isUsuarioExistente(usuario)) { printaNoConsole(usuario.getNome()); } } private Usuario getUsuario(int codigoUsuario) { return dao.getUsuario(codigoUsuario); } private boolean isUsuarioExistente(Usuario usuario) { return usuario != null; } private void printaNoConsole(String mensagem) { system.out.println(mensagem); }
  • 22. Métodos Limpos public void printaNomeUsuario(int codigoUsuario) { Usuario usuario = getUsuario(codigoUsuario); if (isUsuarioExistente(usuario)) { printaNoConsole(usuario.getNome()); } } private Usuario getUsuario(int codigoUsuario) { return dao.getUsuario(codigoUsuario); } private boolean isUsuarioExistente(Usuario usuario) { return usuario != null; } private void printaNoConsole(String mensagem) { system.out.println(mensagem); }
  • 23. Métodos Limpos public void printaNomeUsuario(int codigoUsuario) { Usuario usuario = getUsuario(codigoUsuario); if (isUsuarioExistente(usuario)) { printaNoConsole(usuario.getNome()); } } private Usuario getUsuario(int codigoUsuario) { return dao.getUsuario(codigoUsuario); } private boolean isUsuarioExistente(Usuario usuario) { return usuario != null; } private void printaNoConsole(String mensagem) { system.out.println(mensagem); }
  • 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
  • 31. Tratamento de Erros Limpo public void delete(Page page) { try { deletePageAndAllReferences(page); } catch (Exception e) { logger.log(e.getMessage()); } } private void deletePageAndAllReferences(Page page) throws Exception { deletePage(page); registry.deleteReference(page.name); configKeys.deleteKey(page.name.makeKey()); }
  • 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
  • 34. Código Limpo DEPENDE DE VOCÊ TAMBÉM