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; d...
Revele sua intenção double  calcula( double  d1,  double  d2); int  main() { // preço do produto double  prProd = 17.99; /...
Mapa Mental double  calcula( double  d1,  double  d2); int  main() { // preço do produto double  prProd = 17.99; // valor ...
Revele sua intenção int  main() { //  preço  do  produto double  precoDoProduto = 17.99; // valor do  desconto double  des...
Revele sua intenção int  main() { double  precoDoProduto = 17.99; double  desconto = 0.2; double  valorComDesconto =  calc...
Nomes Genéricos
Nomes Genéricos #Envia o boleto para ser descontado no banco def   processa (boletoBancario): #Calcula o imposto total de ...
Nomes Genéricos #Envia o boleto para ser descontado no banco def   descontarBoleto (boletoBancario): #Calcula o imposto to...
Nomes Genéricos def   descontarBoleto (boletoBancario): def   calcularImposto (funcionario): def   mostrarRelatorio (): de...
Diferencie diferenças
Diferencie diferenças private   double  calculaDesconto( double  d1,  double  d2); private  void copiar(String s1, String ...
Diferencie diferenças private   double  calculaDesconto( double  preco,  double  desconto); private   void  copiar(String ...
Dê nomes a tudo!
Dê nomes a tudo! class   Taxi  { protected : int   horaDaCorrida ; double   quilometros ; public : double  calcularValorCo...
Dê nomes a tudo! #define  PRECO_BANDEIRA_2 3.7 #define  PRECO_BANDEIRA_1 2.9 class   Taxi  { protected : int   horaDaCorri...
Dê nomes a tudo! // opening and closing a file #include   <iostream> #include   <fstream> using   namespace  std; int   ma...
Métodos/Funções
Única responsabilidade
Única responsabilidade public   void  venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem des...
Única responsabilidade public   void  venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem des...
Única responsabilidade public   void  venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem des...
Única responsabilidade public   void  venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem des...
Única responsabilidade public   void  venderProduto(Vendedor vendedor, Produto produto) { double  valorFinal = produto.get...
Agrupar funções
Agrupar funções  public   void  venderProduto( Vendedor vendedor, Produto produto) { double  valorFinal = produto.getPreco...
Estruturas de Decisão
Dê nomes a tudo! #define  PRECO_BANDEIRA_2 3.7 #define  PRECO_BANDEIRA_1 2.9 class   Taxi  { protected : int   horaDaCorri...
Estruturas de Decisão #define  PRECO_BANDEIRA_2 3.7 #define  PRECO_BANDEIRA_1 2.9 class   Taxi  { protected : int   horaDa...
Evite Negações
Estruturas de Decisão #define  PRECO_BANDEIRA_2 3.7 #define  PRECO_BANDEIRA_1 2.9 class   Taxi  { protected : int   horaDa...
Estruturas de Decisão #define  PRECO_BANDEIRA_2 3.7 #define  PRECO_BANDEIRA_1 2.9 class   Taxi  { protected : int   horaDa...
Retornar nulo
Retornar nulo public   double  dividir( int  dividendo,  int  divisor) { if  (divisor == 0) { return  -1; } return  divide...
Retornar nulo public   double  dividir( int  dividendo,  int  divisor) { if  (divisor == 0) { return  -1; } return  divide...
Formatação
Formatação public  String getTabuleiro() { String string =  &quot;&quot; ; for  ( int  i = 0; i < getAltura(); i++) { for ...
Formatação public  String getTabuleiro() { String string =  &quot;&quot; ; for  ( int  i = 0; i < getAltura(); i++) { for ...
Repetição
Repetição public   void  venderProduto(Vendedor vendedor, Produto produto) { // Verifica se o produto tem desconto for  (P...
Repetição public   class  Imagem { public   void  moverImagem( int  x,  int  y){ this .imagem.getRetangulo().getPontoX().s...
Repetição public   class  Imagem { public   void  moverImagem( int  x,  int  y){ this .imagem.getRetangulo().getPontoX().s...
Repetição public   class  Imagem { public   void  moverImagem( int  x,  int  y){ this .imagem.getRetangulo().getPontoX().s...
Bad Smell
Bad Smell <ul><li>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! </li></ul>
! Clean Code
! Clean Code <ul>Clean Code não é sobre: <li>Linguagem
Paradigma
Convenções de Código </li></ul>
! Clean Code <ul>Clean Code não é sobre: <li>Linguagem
Paradigma
Convenções de Código
TROLAGEM! </li></ul>
Sobre o livro Robert C. Martin
Upcoming SlideShare
Loading in...5
×

Clean code

371

Published on

Palestra introdutória sobre Clean Code, ministrada na Universidade Estadual do Ceará como palestra do mês de Novembro do ciclo de palestras mensais organizadas pelo grupo PET Computação UECE.

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
371
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Clean code

  1. 1. Clean Code Marcos Brizeno
  2. 2. Quem sou eu. @marcosbrizeno brizeno.wordpress.com
  3. 3. Motivação
  4. 4. Gambiarras
  5. 5. Sujeira?
  6. 6. Produtividade
  7. 7. Custo para mudar
  8. 8. Profissional?
  9. 9. O que é?
  10. 10. Legibilidade
  11. 11. Elegante
  12. 12. Eficiente
  13. 13. Qualidade de código
  14. 14. Qual Sua Reação?
  15. 15. Qual Sua Reação?
  16. 16. Falar é fácil!
  17. 17. Refatore!
  18. 18. Praticando
  19. 19. Nomes
  20. 20. Revele sua intenção
  21. 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. 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. 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. 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. 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); }
  26. 26. Nomes Genéricos
  27. 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. 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. 29. Nomes Genéricos def descontarBoleto (boletoBancario): def calcularImposto (funcionario): def mostrarRelatorio (): def executarConsultasEmEspera ():
  30. 30. Diferencie diferenças
  31. 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. 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. 33. Dê nomes a tudo!
  34. 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. 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. 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; }
  37. 37. Métodos/Funções
  38. 38. Única responsabilidade
  39. 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. 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. 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. 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. 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); }
  44. 44. Agrupar funções
  45. 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);
  46. 46. Estruturas de Decisão
  47. 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. 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; } };
  49. 49. Evite Negações
  50. 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. 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; } };
  52. 52. Retornar nulo
  53. 53. Retornar nulo public double dividir( int dividendo, int divisor) { if (divisor == 0) { return -1; } return dividendo / divisor; }
  54. 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; }
  55. 55. Formatação
  56. 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. 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; }
  58. 58. Repetição
  59. 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. 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. 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. 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); } }
  63. 63. Bad Smell
  64. 64. Bad Smell <ul><li>Código duplicado!
  65. 65. Métodos longos = muita responsabilidade!
  66. 66. Muitos argumentos são sintomas de muitas responsabilidades!
  67. 67. Argumento booleano grita que a função faz mais de uma coisa!
  68. 68. Sentiu vontade de comentar? Refatore e depois comente!
  69. 69. Se vai comentar, comenta DIREITO! </li></ul>
  70. 70. ! Clean Code
  71. 71. ! Clean Code <ul>Clean Code não é sobre: <li>Linguagem
  72. 72. Paradigma
  73. 73. Convenções de Código </li></ul>
  74. 74. ! Clean Code <ul>Clean Code não é sobre: <li>Linguagem
  75. 75. Paradigma
  76. 76. Convenções de Código
  77. 77. TROLAGEM! </li></ul>
  78. 78. Sobre o livro Robert C. Martin
  79. 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.”
  80. 80. Há Vagas!
  81. 81. Há Vagas!
  82. 82. Há Vagas!
  83. 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.“
  84. 84. Próximos passos
  85. 85. Próximos passos <ul><li>Estudar sobre Refatoração!
  86. 86. Praticar!
  87. 87. Estudar sobre Padrões de Projeto!
  88. 88. Praticar!
  89. 89. Estudar sobre Princípios de Design OO!
  90. 90. Praticar!
  91. 91. Estudar sobre TDD!
  92. 92. Praticar! </li></ul>
  93. 93. Melhorar cada vez mais e mais
  94. 94. Melhorar cada vez mais e mais
  95. 95. Obrigado! @marcosbrizeno brizeno.wordpress.com
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×