SlideShare uma empresa Scribd logo
Clean Code Marcos Brizeno
Quem sou eu. @marcosbrizeno brizeno.wordpress.com
Motivação
Gambiarras
Sujeira?
Produtividade
Custo para mudar
Profissional?
O que é?
Legibilidade
Elegante
Eficiente
Qualidade de código
Qual Sua Reação?
Qual Sua Reação?
Falar é fácil!
Refatore!
Praticando
Nomes
Revele sua intenção
Revele sua intenção double  calcula( double  d1,  double  d2); int  main() { double  prProd = 17.99; double  desc = 0.2; double  valor = calcula(prProd, desc); cout << valor; return  0; } double  calcula( double  d1,  double  d2) { return  d1 - (d1 * d2); }
Revele sua intenção double  calcula( double  d1,  double  d2); int  main() { // preço do produto double  prProd = 17.99; // valor do desconto double  desc = 0.2; // valor do produto com desconto double  valor = calcula(prProd, desc); cout << valor; return  0; } // calcula o valor de um produto com desconto double  calcula( double  d1,  double  d2) { return  d1 - (d1 * d2); }
Mapa Mental double  calcula( double  d1,  double  d2); int  main() { // preço do produto double  prProd = 17.99; // valor do desconto double  desc = 0.2; // valor do produto com desconto double  valor = calcula(prProd, desc); cout << valor; return  0; } // calcula o valor de um produto com desconto double  calcula( double  d1,  double  d2) { return  d1 - (d1 * d2); }
Revele sua intenção int  main() { //  preço  do  produto double  precoDoProduto = 17.99; // valor do  desconto double  desconto = 0.2; // valor do  produto   com   desconto double  valorComDesconto =  calculaDesconto(precoDoProduto, desconto); cout << valor; return  0; } //  calculo  o valor  de   um   produto   com   desconto double  calculaDesconto( double  d1,  double  d2) { return  d1 - (d1 * d2); }
Revele sua intenção int  main() { double  precoDoProduto = 17.99; double  desconto = 0.2; double  valorComDesconto =  calculaDesconto(precoDoProduto, desconto); cout << valor; return  0; } double  calculaDesconto( double  d1,  double  d2) { return  d1 - (d1 * d2); }
Nomes Genéricos
Nomes Genéricos #Envia o boleto para ser descontado no banco def   processa (boletoBancario): #Calcula o imposto total de um funcionário def   calcula (funcionario): #Mostra o relatório de finanças def   mostrar (): #Executa consultas na fila de espera def   executar ():
Nomes Genéricos #Envia o boleto para ser descontado no banco def   descontarBoleto (boletoBancario): #Calcula o imposto total de um funcionário def   calcularImposto (funcionario): #Mostra o relatório de finanças def   mostrarRelatorio (): #Executa consultas na fila de espera def   executarConsultasEmEspera ():
Nomes Genéricos def   descontarBoleto (boletoBancario): def   calcularImposto (funcionario): def   mostrarRelatorio (): def   executarConsultasEmEspera ():
Diferencie diferenças
Diferencie diferenças private   double  calculaDesconto( double  d1,  double  d2); private  void copiar(String s1, String s2); private   boolean  maiorQue( int  n1,  int  n2);
Diferencie diferenças private   double  calculaDesconto( double  preco,  double  desconto); private   void  copiar(String fonte, String alvo); private   boolean  maiorQue( int  referência,  int  numero);
Dê nomes a tudo!
Dê nomes a tudo! class   Taxi  { protected : int   horaDaCorrida ; double   quilometros ; public : double  calcularValorCorrida() { if  ( horaDaCorrida  > 22 &&  horaDaCorrida  < 5) { return   quilometros  * 3.7; } return   quilometros  * 2.9; } };
Dê nomes a tudo! #define  PRECO_BANDEIRA_2 3.7 #define  PRECO_BANDEIRA_1 2.9 class   Taxi  { protected : int   horaDaCorrida ; double   quilometros ; public : double  calcularValorCorrida() { if  ( horaDaCorrida  > 22 &&  horaDaCorrida  < 5) { return   quilometros  * PRECO_BANDEIRA_2; } return   quilometros  * PRECO_BANDEIRA_1; } };
Dê nomes a tudo! // opening and closing a file #include   <iostream> #include   <fstream> using   namespace  std; int   main () { ofstream  outfile; outfile.open( &quot;.// tmp //test.txt&quot; ); // >> i/o operations here << outfile.close(); return  0; } // opening and closing a file #include   <iostream> #include   <fstream> using   namespace  std; #define  TMP_DIR  &quot;.// tmp //&quot; int   main () { ofstream  outfile; string  diretorio = TMP_DIR; diretorio.append( &quot;test.txt&quot; ); outfile.open(diretorio.c_str()); // >> i/o operations here << outfile.close(); return  0; }
Métodos/Funções
Única responsabilidade
Única responsabilidade public   void  venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto for  (Produto produtosComDesconto : ProdutosComDesconto) { if  (produtosComDesconto.getId() == produto.getId()) { // Calcula o valor com desconto double  valorFinal = produto.getPreco() -  produto.getPreco() *  VALOR_DESCONTO ; // Cria o boleto de pagamento Boleto boletoDePagamento =  new  Boleto(); boletoDePagamento.setNomeVendedor(vendedor.getNome()); boletoDePagamento.setValor(valorFinal); boletoDePagamento.imprimir(); } } // Se o produto não tiver desconto // Cria o boleto de pagamento Boleto boletoDePagamento =  new  Boleto(); boletoDePagamento.setNomeVendedor(vendedor.getNome()); boletoDePagamento.setValor(produto.getValor()); boletoDePagamento.imprimir(); }
Única responsabilidade public   void  venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto for  (Produto produtosComDesconto : ProdutosComDesconto) { if  (produtosComDesconto.getId() == produto.getId()) { // Calcula o valor com desconto double  valorFinal = produto.getPreco() -  produto.getPreco() *  VALOR_DESCONTO ; // Cria o boleto de pagamento criarBoletoDePagamento(vendedor.getNome(), valorFinal); } } // Se o produto não tiver desconto // Cria o boleto de pagamento criarBoletoDePagamento(vendedor.getNome(), produto.getPreco()); }
Única responsabilidade public   void  venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto if   (produtoTemDesconto(produto))   { // Calcula o valor com desconto double  valorFinal = produto.getPreco() -  produto.getPreco() *  VALOR_DESCONTO ; // Cria o boleto de pagamento criarBoletoDePagamento(vendedor.getNome(), valorFinal); } // Se o produto não tiver desconto // Cria o boleto de pagamento criarBoletoDePagamento(vendedor.getNome(), produto.getPreco()); }
Única responsabilidade public   void  venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto double  valorFinal = produto.getPreco(); if  (produtoTemDesconto(produto)) { // Calcula o valor com desconto // Cria o boleto de pagamento   valorFinal = calcularDesconto(produto.getPreco()); } // Se o produto não tiver desconto // Cria o boleto de pagamento criarBoletoDePagamento(vendedor.getNome(), valorFinal); }
Única responsabilidade public   void  venderProduto(Vendedor vendedor, Produto produto) { double  valorFinal = produto.getPreco(); if  (produtoTemDesconto(produto))    valorFinal = calcularDesconto(produto.getPreco()); } criarBoletoDePagamento(vendedor.getNome(), valorFinal); }
Agrupar funções
Agrupar funções  public   void  venderProduto( Vendedor vendedor, Produto produto) { double  valorFinal = produto.getPreco(); if  (produtoTemDesconto(produto)) {   valorFinal = calcularDesconto(produto.getPreco()); } criarBoletoDePagamento(vendedor.getNome(), valorFinal); } public   void  criarBoletoDePagamento(String nomeVendedor,  double  valorProduto); public   double  calcularDesconto( double  preco); public   boolean  produtoTemDesconto(Produto produto);
Estruturas de Decisão
Dê nomes a tudo! #define  PRECO_BANDEIRA_2 3.7 #define  PRECO_BANDEIRA_1 2.9 class   Taxi  { protected : int   horaDaCorrida ; double   quilometros ; public : double  calcularValorCorrida() { if  ( horaDaCorrida  > 22 &&  horaDaCorrida  < 5) { return   quilometros  * PRECO_BANDEIRA_2; } return   quilometros  * PRECO_BANDEIRA_1; } };
Estruturas de Decisão #define  PRECO_BANDEIRA_2 3.7 #define  PRECO_BANDEIRA_1 2.9 class   Taxi  { protected : int   horaDaCorrida ; double   quilometros ; private : bool  ehHorarioNormal() { return   horaDaCorrida  < 22 &&  horaDaCorrida  > 5; } public : double  calcularValorCorrida() { if  (!ehHorarioNormal()) { return   quilometros  * PRECO_BANDEIRA_2; } return   quilometros  * PRECO_BANDEIRA_1; } };
Evite Negações
Estruturas de Decisão #define  PRECO_BANDEIRA_2 3.7 #define  PRECO_BANDEIRA_1 2.9 class   Taxi  { protected : int   horaDaCorrida ; double   quilometros ; private : bool  ehHorarioNormal() { return   horaDaCorrida  < 22 &&  horaDaCorrida  > 5; } public : double  calcularValorCorrida() { if  (!ehHorarioNormal()) { return   quilometros  * PRECO_BANDEIRA_2; } return   quilometros  * PRECO_BANDEIRA_1; } };
Estruturas de Decisão #define  PRECO_BANDEIRA_2 3.7 #define  PRECO_BANDEIRA_1 2.9 class   Taxi  { protected : int   horaDaCorrida ; double   quilometros ; private : bool  ehHorarioNormal() { return   horaDaCorrida  < 22 &&  horaDaCorrida  > 5; } public : double  calcularValorCorrida() { if  (ehHorarioNormal()) { return   quilometros  * PRECO_BANDEIRA_1; } return   quilometros  * PRECO_BANDEIRA_2; } };
Retornar nulo
Retornar nulo public   double  dividir( int  dividendo,  int  divisor) { if  (divisor == 0) { return  -1; } return  dividendo / divisor; }
Retornar nulo public   double  dividir( int  dividendo,  int  divisor) { if  (divisor == 0) { return  -1; } return  dividendo / divisor; } public   double  dividir( int  dividendo,  int  divisor)  throws  Exception { if  (divisor == 0) { throw   new  Exception( &quot;Impossível dividir por zero&quot; ); } return  dividendo / divisor; }
Formatação
Formatação public  String getTabuleiro() { String string =  &quot;&quot; ; for  ( int  i = 0; i < getAltura(); i++) { for  ( int  j = 0; j < getLargura(); j++) { string +=  tabuleiroEscondido [i][j];} if  (i !=  tabuleiroEscondido . length  - 1) { string +=  &quot;\n&quot; ; } } return  string; }
Formatação public  String getTabuleiro() { String string =  &quot;&quot; ; for  ( int  i = 0; i < getAltura(); i++) { for  ( int  j = 0; j < getLargura(); j++) { string +=  tabuleiroEscondido [i][j]; } if  (i !=  tabuleiroEscondido . length  - 1) { string +=  &quot;\n&quot; ; } } return  string; }
Repetição
Repetição public   void  venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto for  (Produto produtosComDesconto : ProdutosComDesconto) { if  (produtosComDesconto.getId() == produto.getId()) { // Calcula o valor com desconto double  valorFinal = produto.getPreco() -  produto.getPreco() *  VALOR_DESCONTO ; // Cria o boleto de pagamento Boleto boletoDePagamento =  new  Boleto(); boletoDePagamento.setNomeVendedor(vendedor.getNome()); boletoDePagamento.setValor(valorFinal); boletoDePagamento.imprimir(); } } // Se o produto não tiver desconto // Cria o boleto de pagamento Boleto boletoDePagamento =  new  Boleto(); boletoDePagamento.setNomeVendedor(vendedor.getNome()); boletoDePagamento.setValor(produto.getValor()); boletoDePagamento.imprimir(); }
Repetição public   class  Imagem { public   void  moverImagem( int  x,  int  y){ this .imagem.getRetangulo().getPontoX().set(x); this .imagem.getRetangulo().getPontoY().set(y); } }
Repetição public   class  Imagem { public   void  moverImagem( int  x,  int  y){ this .imagem.getRetangulo().getPontoX().set(x); this .imagem.getRetangulo().getPontoY().set(y); } }
Repetição public   class  Imagem { public   void  moverImagem( int  x,  int  y){ this .imagem.getRetangulo().getPontoX().set(x); this .imagem.getRetangulo().getPontoY().set(y); } } public   class  Imagem { public   void  moverImagem( int  x,  int  y){ this .imagem.getRetangulo().mover(x, y); } }
Bad Smell
Bad Smell Código duplicado!
Métodos longos = muita responsabilidade!
Muitos argumentos são sintomas de muitas responsabilidades!
Argumento booleano grita que a função faz mais de uma coisa!
Sentiu vontade de comentar? Refatore e depois comente!
Se vai comentar, comenta DIREITO!
! Clean Code
! Clean Code Clean Code não é sobre: Linguagem
Paradigma
Convenções de Código
! Clean Code Clean Code não é sobre: Linguagem
Paradigma
Convenções de Código
TROLAGEM!
Sobre o livro Robert C. Martin

Mais conteúdo relacionado

PDF
PHP ao Extremo
ODP
App scala
PDF
Refatoração de código com Capitão Nascimento versão completa
PDF
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
PDF
Python: a primeira mordida
PDF
SQL - Banco de Dados Biblioteca
KEY
PHPubSP Object Calisthenics aplicado ao PHP
PDF
Clean Code Matters!
PHP ao Extremo
App scala
Refatoração de código com Capitão Nascimento versão completa
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
Python: a primeira mordida
SQL - Banco de Dados Biblioteca
PHPubSP Object Calisthenics aplicado ao PHP
Clean Code Matters!

Mais procurados (20)

PDF
Cafe com Tom - ExtJS 4
PPT
Paradigmas de Linguagens de Programacao - Aula #3
PDF
2 funcoes e estrutura de blocos
PDF
Aprendendo objective c - parte 1
PPT
(Portuguese) Java EE Poliglota
PDF
Combatendo code smells em aplicações Java
PDF
PHP para Adultos: Clean Code e Object Calisthenics
PDF
Passagem de Objetos entre Java e Oracle
PPTX
As Novidades Do C# 4.0 - NetPonto
PPTX
Javascript avançado
PDF
Object Calisthenics: relaxe e escreva códigos simples
DOCX
Programação Estruturada 2 - Aula 03 - Código Fonte
PPT
Introdução à análise orientada a objetos parte 2
KEY
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
PDF
Clean Code Matters - JavaScript
PDF
Refactoring
PDF
113856859 exercicios-vetor-e-matriz
PPTX
Semana 10: Encapsulação, cópia de instâncias, igualdade de instâncias
PDF
Introdução à Linguagem Ruby
PDF
Java script aula 08 - formulários
Cafe com Tom - ExtJS 4
Paradigmas de Linguagens de Programacao - Aula #3
2 funcoes e estrutura de blocos
Aprendendo objective c - parte 1
(Portuguese) Java EE Poliglota
Combatendo code smells em aplicações Java
PHP para Adultos: Clean Code e Object Calisthenics
Passagem de Objetos entre Java e Oracle
As Novidades Do C# 4.0 - NetPonto
Javascript avançado
Object Calisthenics: relaxe e escreva códigos simples
Programação Estruturada 2 - Aula 03 - Código Fonte
Introdução à análise orientada a objetos parte 2
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Clean Code Matters - JavaScript
Refactoring
113856859 exercicios-vetor-e-matriz
Semana 10: Encapsulação, cópia de instâncias, igualdade de instâncias
Introdução à Linguagem Ruby
Java script aula 08 - formulários
Anúncio

Semelhante a Clean code (20)

PPT
Introdução à análise orientada a objetos parte 1
PPT
Introdução à análise orientada a objetos parte 1
PPTX
Clean Code
PPTX
Design patterns
DOCX
PDF
PPTX
Dojo tuba delphi
DOCX
Cap07 procedimentos funcoes_v00_tav
PPT
Encapsulamento em oo
PDF
Programação orientada a objetos em delphi
PPTX
Técnicas de Refactoring
PDF
Android DevConference - SOLID no Android
PDF
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
PPSX
TDD e Clean Code
DOC
Java orientação a objetos (introdução) - exercicios
PPTX
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
PDF
Lista 2 1 java
KEY
Conexão Java 2012 - Orientação a Objetos das Galáxias
PDF
Refinamento e boas práticas de programação
PDF
Vamos falar de Clean Code, Refatoração e TDD
Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1
Clean Code
Design patterns
Dojo tuba delphi
Cap07 procedimentos funcoes_v00_tav
Encapsulamento em oo
Programação orientada a objetos em delphi
Técnicas de Refactoring
Android DevConference - SOLID no Android
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
TDD e Clean Code
Java orientação a objetos (introdução) - exercicios
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Lista 2 1 java
Conexão Java 2012 - Orientação a Objetos das Galáxias
Refinamento e boas práticas de programação
Vamos falar de Clean Code, Refatoração e TDD
Anúncio

Mais de Marcos Brizeno (18)

PDF
Refatorando tudo! [Agile brazil 2017]
PDF
GraphQL ou APIs RESTful - DevDay 2017
PDF
Developer Experience como diferencial na Transformação Digital
PDF
Desventuras em série adotando microserviços
PDF
Aprenda Elixir em um final de semana
PDF
5 mitos sobre código bom
PDF
Padrões de projeto superestimados
PDF
Abraçando a mudança com Código
PDF
Práticas Ágeis Distribuidas
PDF
The fine art of slacking
PDF
Aplicando padrões de projeto em Ruby
PDF
Comunidade e Carreira: Você Ganha Todos Ganham
PDF
Dubles de teste
PDF
Entrega Contínua - E Eu Com Isso?
PDF
The fine art of slacking
PDF
Programar #COMOFAS ? - Rails Girls Fortaleza
PDF
Metaprogramação Ruby
ODP
Arquitetura Ágil
Refatorando tudo! [Agile brazil 2017]
GraphQL ou APIs RESTful - DevDay 2017
Developer Experience como diferencial na Transformação Digital
Desventuras em série adotando microserviços
Aprenda Elixir em um final de semana
5 mitos sobre código bom
Padrões de projeto superestimados
Abraçando a mudança com Código
Práticas Ágeis Distribuidas
The fine art of slacking
Aplicando padrões de projeto em Ruby
Comunidade e Carreira: Você Ganha Todos Ganham
Dubles de teste
Entrega Contínua - E Eu Com Isso?
The fine art of slacking
Programar #COMOFAS ? - Rails Girls Fortaleza
Metaprogramação Ruby
Arquitetura Ágil

Último (20)

PDF
Metabolismo_energético_3ano_pre_vest_2026.pdf
PPTX
norma regulamentadora numero vinte nr 20
PPTX
GUERRAFRIA.pptdddddddddddddddddddddddddx
PDF
50 anos Hoje - Volume V - 1973 - Manaus Amazonas
PPTX
QuestõesENEMVESTIBULARPARAESTUDOSEAPRENDIZADO.pptx
PPTX
Aula 13 - Tópico Frasal - Argumentação.pptx
PDF
ESPELHOS DA ALMA A PSICOLOGIA POR TRÁS DOS CONTOS DE FADAS.pdf
PPTX
Biologia celular: citologia, é o estudo da célula, a unidade básica da vida.
PDF
embriologia_animal_aula_share_2026_semestre
PDF
Combate a Incêndio - Estratégias e Táticas de Combate a Incêndio por Francis...
PDF
A relação entre funções executivas e desempenho acadêmico em crianças com Tra...
PPTX
TREINAMENTO DE INSPETOR DE ANDAIMES.pptx
PDF
Extintores e Acessórios por Francisco Borges.pdf
PDF
RELATÓRIO DE ESTÁGIO SURVISIONADO: NEUROPSICOPEDAGOGIA INSTITUCIONAL, CLÍNIC...
PPT
História e Evolução dos Computadores domésticos
DOC
PPP 2024 (2) (2) feito EM REELABORAÇÃO MORENA ( ABRIL 2024).doc
PPTX
Pedagogia em Ambientes Não Escolares.pptx
PPTX
NR11 - Treinamento Direcao Defensiva - 2023.pptx
PDF
Um dia na casa do Mensageiro (que a paz e benção de Deus estejam com ele)
PDF
metabolismo energtico das clulas-131017092002-phpapp02.pdf
Metabolismo_energético_3ano_pre_vest_2026.pdf
norma regulamentadora numero vinte nr 20
GUERRAFRIA.pptdddddddddddddddddddddddddx
50 anos Hoje - Volume V - 1973 - Manaus Amazonas
QuestõesENEMVESTIBULARPARAESTUDOSEAPRENDIZADO.pptx
Aula 13 - Tópico Frasal - Argumentação.pptx
ESPELHOS DA ALMA A PSICOLOGIA POR TRÁS DOS CONTOS DE FADAS.pdf
Biologia celular: citologia, é o estudo da célula, a unidade básica da vida.
embriologia_animal_aula_share_2026_semestre
Combate a Incêndio - Estratégias e Táticas de Combate a Incêndio por Francis...
A relação entre funções executivas e desempenho acadêmico em crianças com Tra...
TREINAMENTO DE INSPETOR DE ANDAIMES.pptx
Extintores e Acessórios por Francisco Borges.pdf
RELATÓRIO DE ESTÁGIO SURVISIONADO: NEUROPSICOPEDAGOGIA INSTITUCIONAL, CLÍNIC...
História e Evolução dos Computadores domésticos
PPP 2024 (2) (2) feito EM REELABORAÇÃO MORENA ( ABRIL 2024).doc
Pedagogia em Ambientes Não Escolares.pptx
NR11 - Treinamento Direcao Defensiva - 2023.pptx
Um dia na casa do Mensageiro (que a paz e benção de Deus estejam com ele)
metabolismo energtico das clulas-131017092002-phpapp02.pdf

Clean code

  • 2. Quem sou eu. @marcosbrizeno brizeno.wordpress.com
  • 19. Nomes
  • 21. Revele sua intenção double calcula( double d1, double d2); int main() { double prProd = 17.99; double desc = 0.2; double valor = calcula(prProd, desc); cout << valor; return 0; } double calcula( double d1, double d2) { return d1 - (d1 * d2); }
  • 22. Revele sua intenção double calcula( double d1, double d2); int main() { // preço do produto double prProd = 17.99; // valor do desconto double desc = 0.2; // valor do produto com desconto double valor = calcula(prProd, desc); cout << valor; return 0; } // calcula o valor de um produto com desconto double calcula( double d1, double d2) { return d1 - (d1 * d2); }
  • 23. Mapa Mental double calcula( double d1, double d2); int main() { // preço do produto double prProd = 17.99; // valor do desconto double desc = 0.2; // valor do produto com desconto double valor = calcula(prProd, desc); cout << valor; return 0; } // calcula o valor de um produto com desconto double calcula( double d1, double d2) { return d1 - (d1 * d2); }
  • 24. Revele sua intenção int main() { // preço do produto double precoDoProduto = 17.99; // valor do desconto double desconto = 0.2; // valor do produto com desconto double valorComDesconto = calculaDesconto(precoDoProduto, desconto); cout << valor; return 0; } // calculo o valor de um produto com desconto double calculaDesconto( double d1, double d2) { return d1 - (d1 * d2); }
  • 25. Revele sua intenção int main() { double precoDoProduto = 17.99; double desconto = 0.2; double valorComDesconto = calculaDesconto(precoDoProduto, desconto); cout << valor; return 0; } double calculaDesconto( double d1, double d2) { return d1 - (d1 * d2); }
  • 27. Nomes Genéricos #Envia o boleto para ser descontado no banco def processa (boletoBancario): #Calcula o imposto total de um funcionário def calcula (funcionario): #Mostra o relatório de finanças def mostrar (): #Executa consultas na fila de espera def executar ():
  • 28. Nomes Genéricos #Envia o boleto para ser descontado no banco def descontarBoleto (boletoBancario): #Calcula o imposto total de um funcionário def calcularImposto (funcionario): #Mostra o relatório de finanças def mostrarRelatorio (): #Executa consultas na fila de espera def executarConsultasEmEspera ():
  • 29. Nomes Genéricos def descontarBoleto (boletoBancario): def calcularImposto (funcionario): def mostrarRelatorio (): def executarConsultasEmEspera ():
  • 31. Diferencie diferenças private double calculaDesconto( double d1, double d2); private void copiar(String s1, String s2); private boolean maiorQue( int n1, int n2);
  • 32. Diferencie diferenças private double calculaDesconto( double preco, double desconto); private void copiar(String fonte, String alvo); private boolean maiorQue( int referência, int numero);
  • 33. Dê nomes a tudo!
  • 34. Dê nomes a tudo! class Taxi { protected : int horaDaCorrida ; double quilometros ; public : double calcularValorCorrida() { if ( horaDaCorrida > 22 && horaDaCorrida < 5) { return quilometros * 3.7; } return quilometros * 2.9; } };
  • 35. Dê nomes a tudo! #define PRECO_BANDEIRA_2 3.7 #define PRECO_BANDEIRA_1 2.9 class Taxi { protected : int horaDaCorrida ; double quilometros ; public : double calcularValorCorrida() { if ( horaDaCorrida > 22 && horaDaCorrida < 5) { return quilometros * PRECO_BANDEIRA_2; } return quilometros * PRECO_BANDEIRA_1; } };
  • 36. Dê nomes a tudo! // opening and closing a file #include <iostream> #include <fstream> using namespace std; int main () { ofstream outfile; outfile.open( &quot;.// tmp //test.txt&quot; ); // >> i/o operations here << outfile.close(); return 0; } // opening and closing a file #include <iostream> #include <fstream> using namespace std; #define TMP_DIR &quot;.// tmp //&quot; int main () { ofstream outfile; string diretorio = TMP_DIR; diretorio.append( &quot;test.txt&quot; ); outfile.open(diretorio.c_str()); // >> i/o operations here << outfile.close(); return 0; }
  • 39. Única responsabilidade public void venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto for (Produto produtosComDesconto : ProdutosComDesconto) { if (produtosComDesconto.getId() == produto.getId()) { // Calcula o valor com desconto double valorFinal = produto.getPreco() - produto.getPreco() * VALOR_DESCONTO ; // Cria o boleto de pagamento Boleto boletoDePagamento = new Boleto(); boletoDePagamento.setNomeVendedor(vendedor.getNome()); boletoDePagamento.setValor(valorFinal); boletoDePagamento.imprimir(); } } // Se o produto não tiver desconto // Cria o boleto de pagamento Boleto boletoDePagamento = new Boleto(); boletoDePagamento.setNomeVendedor(vendedor.getNome()); boletoDePagamento.setValor(produto.getValor()); boletoDePagamento.imprimir(); }
  • 40. Única responsabilidade public void venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto for (Produto produtosComDesconto : ProdutosComDesconto) { if (produtosComDesconto.getId() == produto.getId()) { // Calcula o valor com desconto double valorFinal = produto.getPreco() - produto.getPreco() * VALOR_DESCONTO ; // Cria o boleto de pagamento criarBoletoDePagamento(vendedor.getNome(), valorFinal); } } // Se o produto não tiver desconto // Cria o boleto de pagamento criarBoletoDePagamento(vendedor.getNome(), produto.getPreco()); }
  • 41. Única responsabilidade public void venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto if (produtoTemDesconto(produto)) { // Calcula o valor com desconto double valorFinal = produto.getPreco() - produto.getPreco() * VALOR_DESCONTO ; // Cria o boleto de pagamento criarBoletoDePagamento(vendedor.getNome(), valorFinal); } // Se o produto não tiver desconto // Cria o boleto de pagamento criarBoletoDePagamento(vendedor.getNome(), produto.getPreco()); }
  • 42. Única responsabilidade public void venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto double valorFinal = produto.getPreco(); if (produtoTemDesconto(produto)) { // Calcula o valor com desconto // Cria o boleto de pagamento valorFinal = calcularDesconto(produto.getPreco()); } // Se o produto não tiver desconto // Cria o boleto de pagamento criarBoletoDePagamento(vendedor.getNome(), valorFinal); }
  • 43. Única responsabilidade public void venderProduto(Vendedor vendedor, Produto produto) { double valorFinal = produto.getPreco(); if (produtoTemDesconto(produto)) valorFinal = calcularDesconto(produto.getPreco()); } criarBoletoDePagamento(vendedor.getNome(), valorFinal); }
  • 45. Agrupar funções public void venderProduto( Vendedor vendedor, Produto produto) { double valorFinal = produto.getPreco(); if (produtoTemDesconto(produto)) { valorFinal = calcularDesconto(produto.getPreco()); } criarBoletoDePagamento(vendedor.getNome(), valorFinal); } public void criarBoletoDePagamento(String nomeVendedor, double valorProduto); public double calcularDesconto( double preco); public boolean produtoTemDesconto(Produto produto);
  • 47. Dê nomes a tudo! #define PRECO_BANDEIRA_2 3.7 #define PRECO_BANDEIRA_1 2.9 class Taxi { protected : int horaDaCorrida ; double quilometros ; public : double calcularValorCorrida() { if ( horaDaCorrida > 22 && horaDaCorrida < 5) { return quilometros * PRECO_BANDEIRA_2; } return quilometros * PRECO_BANDEIRA_1; } };
  • 48. Estruturas de Decisão #define PRECO_BANDEIRA_2 3.7 #define PRECO_BANDEIRA_1 2.9 class Taxi { protected : int horaDaCorrida ; double quilometros ; private : bool ehHorarioNormal() { return horaDaCorrida < 22 && horaDaCorrida > 5; } public : double calcularValorCorrida() { if (!ehHorarioNormal()) { return quilometros * PRECO_BANDEIRA_2; } return quilometros * PRECO_BANDEIRA_1; } };
  • 50. Estruturas de Decisão #define PRECO_BANDEIRA_2 3.7 #define PRECO_BANDEIRA_1 2.9 class Taxi { protected : int horaDaCorrida ; double quilometros ; private : bool ehHorarioNormal() { return horaDaCorrida < 22 && horaDaCorrida > 5; } public : double calcularValorCorrida() { if (!ehHorarioNormal()) { return quilometros * PRECO_BANDEIRA_2; } return quilometros * PRECO_BANDEIRA_1; } };
  • 51. Estruturas de Decisão #define PRECO_BANDEIRA_2 3.7 #define PRECO_BANDEIRA_1 2.9 class Taxi { protected : int horaDaCorrida ; double quilometros ; private : bool ehHorarioNormal() { return horaDaCorrida < 22 && horaDaCorrida > 5; } public : double calcularValorCorrida() { if (ehHorarioNormal()) { return quilometros * PRECO_BANDEIRA_1; } return quilometros * PRECO_BANDEIRA_2; } };
  • 53. Retornar nulo public double dividir( int dividendo, int divisor) { if (divisor == 0) { return -1; } return dividendo / divisor; }
  • 54. Retornar nulo public double dividir( int dividendo, int divisor) { if (divisor == 0) { return -1; } return dividendo / divisor; } public double dividir( int dividendo, int divisor) throws Exception { if (divisor == 0) { throw new Exception( &quot;Impossível dividir por zero&quot; ); } return dividendo / divisor; }
  • 56. Formatação public String getTabuleiro() { String string = &quot;&quot; ; for ( int i = 0; i < getAltura(); i++) { for ( int j = 0; j < getLargura(); j++) { string += tabuleiroEscondido [i][j];} if (i != tabuleiroEscondido . length - 1) { string += &quot;\n&quot; ; } } return string; }
  • 57. Formatação public String getTabuleiro() { String string = &quot;&quot; ; for ( int i = 0; i < getAltura(); i++) { for ( int j = 0; j < getLargura(); j++) { string += tabuleiroEscondido [i][j]; } if (i != tabuleiroEscondido . length - 1) { string += &quot;\n&quot; ; } } return string; }
  • 59. Repetição public void venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto for (Produto produtosComDesconto : ProdutosComDesconto) { if (produtosComDesconto.getId() == produto.getId()) { // Calcula o valor com desconto double valorFinal = produto.getPreco() - produto.getPreco() * VALOR_DESCONTO ; // Cria o boleto de pagamento Boleto boletoDePagamento = new Boleto(); boletoDePagamento.setNomeVendedor(vendedor.getNome()); boletoDePagamento.setValor(valorFinal); boletoDePagamento.imprimir(); } } // Se o produto não tiver desconto // Cria o boleto de pagamento Boleto boletoDePagamento = new Boleto(); boletoDePagamento.setNomeVendedor(vendedor.getNome()); boletoDePagamento.setValor(produto.getValor()); boletoDePagamento.imprimir(); }
  • 60. Repetição public class Imagem { public void moverImagem( int x, int y){ this .imagem.getRetangulo().getPontoX().set(x); this .imagem.getRetangulo().getPontoY().set(y); } }
  • 61. Repetição public class Imagem { public void moverImagem( int x, int y){ this .imagem.getRetangulo().getPontoX().set(x); this .imagem.getRetangulo().getPontoY().set(y); } }
  • 62. Repetição public class Imagem { public void moverImagem( int x, int y){ this .imagem.getRetangulo().getPontoX().set(x); this .imagem.getRetangulo().getPontoY().set(y); } } public class Imagem { public void moverImagem( int x, int y){ this .imagem.getRetangulo().mover(x, y); } }
  • 64. Bad Smell Código duplicado!
  • 65. Métodos longos = muita responsabilidade!
  • 66. Muitos argumentos são sintomas de muitas responsabilidades!
  • 67. Argumento booleano grita que a função faz mais de uma coisa!
  • 68. Sentiu vontade de comentar? Refatore e depois comente!
  • 69. Se vai comentar, comenta DIREITO!
  • 71. ! Clean Code Clean Code não é sobre: Linguagem
  • 74. ! Clean Code Clean Code não é sobre: Linguagem
  • 78. Sobre o livro Robert C. Martin
  • 79. Bons programadores “ Você está lendo este livro por dois motivos. Primeiro, você é um programador. Segundo, você quer ser um programador melhor. Bom. Precisamos de melhores programadores.”
  • 83. Praticar é preciso “ Aprender a escrever um código limpo é uma tarefa difícil. Requer mais que conhecimento sobre princípios e padrões. Você precisa suar. Você precisa praticar e ver suas falhas.“
  • 85. Próximos passos Estudar sobre Refatoração!
  • 87. Estudar sobre Padrões de Projeto!
  • 89. Estudar sobre Princípios de Design OO!
  • 93. Melhorar cada vez mais e mais
  • 94. Melhorar cada vez mais e mais