Clean Code (EN ESPANOL)

2,186 views

Published on

Published in: Technology
1 Comment
4 Likes
Statistics
Notes
No Downloads
Views
Total views
2,186
On SlideShare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
0
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide
  • Hola! Muybuenastardes.Bienvenidos al entrenamento de Clean Code. Es um gran placer estaraquí en vuestra casa, en Peru. En los próximos dos díasvamosestar a juntoshablando de calidad de código, técnicas de refactorización, orientación a objectos, pruebasautomatizadas entre otrascosas
  • Clean Code (EN ESPANOL)

    1. 1. Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br/es Clean Code con Técnicas de Refactorización y TDD
    2. 2. Acerca de la iniciativa...
    3. 3. Estatísticas del entrenamiento de Clean Code hasta la fecha: Primer grupo en: 05/2012 Clases ya realizadas: 21 Desarrolladores entrenados: 340
    4. 4. AgileCode “Transformar la manera en que los equipos de desarrollo de software trabajan, aumentando su nivel de madurez técnica y gerencial” http://www.agilecode.com.br/es
    5. 5. Rodrigo Branas rodrigo.branas@agilecode.com.br http://www.agilecode.com.br • • • • Desarrollo de Software en Gennera Entrenamientos en Agile Code Artículos en Java Magazine Conferencias sobre desarrollo de software en eventos, universidades y empresas
    6. 6. Formación Académica Ciencias de la Computación - UFSC Gestión de Proyectos - FGV Certificaciones SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM Experiencia Desde hace más de 12 años desarrollando software en la plataforma Java en las empresas: EDS, HP, NET, Citibank, GM, Dígitro, Softplan, OnCast, Senai, VALE, RBS, Unimed, Globalcode, V.Office, Suntech, WPlex e Gennera.
    7. 7. El contenido deste entrenamiento puede afectar su zona de confort
    8. 8. ¿Sobre que vamos hablar?
    9. 9. Insatisfación con el fracaso!
    10. 10. ¿Existe diferencia?
    11. 11. Insatisfación con el trabajo
    12. 12. ¿Te sientes profesional?
    13. 13. ¿Te sientes profesional?
    14. 14. ¿Te sientes profesional?
    15. 15. ¿Podría ser más productivo?
    16. 16. ¿Cuanto tiempo perdemos intentando entender el código para arreglar un defecto?
    17. 17. ¿Te sientes haciendo un trabajo brazal y fatigoso?
    18. 18. ¿Ya quisiste dejarlo todo?
    19. 19. ¿Que motiva a un desarrollador?
    20. 20. “Quien trabaja solamente por el diñero, ganhe lo que for, siempre será mal pago.”
    21. 21. “Cual es tu obra?” (Mario Cortella)
    22. 22. ¿Cuanto custa toda esta confusión para la empresa?
    23. 23. Alta rotatividad
    24. 24. Demora excesiva para poner nuevos productos en marcha
    25. 25. ¿Cuantos proyectos ya fueran desechados?
    26. 26. Muchos defectos
    27. 27. ¿Cuanto custa la perdida de confianza de sus clientes?
    28. 28. Passamos la major parte del tiempo leyendo el código!
    29. 29. ¿Dos desarrolladores son más productivos que uno? (Pair Programming)
    30. 30. ¿Que es Clean Code?
    31. 31. Echo con cuidado
    32. 32. Inteligente
    33. 33. Reusable
    34. 34. Revela sus intenciones
    35. 35. Sencillo
    36. 36. Fácil de entender
    37. 37. “Cualquier tonto consigue escribir un código que el ordenador entienda. Buenos programadores escriben código que otros humanos comprendan.” (Martin Fowler)
    38. 38. Funcionar es lo mínimo
    39. 39. Calidad Externa x Interna
    40. 40. ¿Como medir la calidad del código?
    41. 41. ¿Líneas de código? ¿Número de métodos? ¿Número de classes? ¿Tamanho de los método? ¿Complejidad? ???
    42. 42. WTF?
    43. 43. WTF? WTF?
    44. 44. WTF? WTF? WTF? WTF?
    45. 45. Dificuldad para entenderse
    46. 46. Decirlo es fácil!
    47. 47. Empezando a entrenar
    48. 48. Nomes estraños
    49. 49. Limitación histórica
    50. 50. 1. 2. 3. 4. 5. 6. 7. 8. 9. READ INPUT TAPE A1, B1, C1; 501 FORMAT A1; IF (A1) 777, 777, 777 IF (B1) 888, 888, 888 IF (C1) 999, 999, 999 STOP 1 799 S = FLOATF(A1 + B1 + C1) / 2.0 WRITE TO TAPE S END PROCESS Las linguajes no ayudavam
    51. 51. Los entornos de desarrollo no ayudavam
    52. 52. Los ordenadores no ayudavam
    53. 53. Herencia Maldita
    54. 54. Aprendiendo con los mestres
    55. 55. 1. 2. 3. 4. 5. 6. 7. 8. // Descripción de la maquina String mDesc; // Suma de las parcelas int s1; // Color de los ojos String cOjos; // Cotización del Dólar int aux;
    56. 56. Revelando su intención
    57. 57. 1. 2. 3. 4. 5. 6. 7. 8. // Descripción de la maquina String mDesc; // Suma de las parcelas int s1; // Color de los ojos String cOjos; // Cotazición del Dólar int aux;
    58. 58. 1. 2. 3. 4. 5. 6. 7. 8. // Descripción de la maquina String; // Suma de las parcelas int; // Color de los ojos String; // Cotización del Dólar int;
    59. 59. 1. 2. 3. 4. 5. 6. 7. 8. // Descripción de la maquina String descriptionDeLaMaquina; // Suma de las parcelas int sumaDeLasParcelas; // Color de los ojos String colorDeLosOjos; // Cotización del Dólar int cotizacionDelDolar;
    60. 60. 1. 2. 3. 4. 5. 6. 7. 8. String descriptionDeLaMaquina; int sumaDeLasParcelas; String colorDeLosOjos; int cotizacionDelDolar;
    61. 61. 1. 2. 3. 4. String descriptionDeLaMaquina; int sumaDeLasParcelas; String colorDeLosOjos; int cotizacionDelDolar;
    62. 62. No seas tan genérico
    63. 63. 1. 2. 3. 4. 5. 6. // Ejecutar el cálculo de la nómina void ejecutar(); // Calcular el impuesto void calcular(); // Renderizar la imagen void renderizar(); 7. // Totalizar los costos de las llamadas 8. void totalizar();
    64. 64. 1. 2. 3. 4. 5. 6. // Ejecutar el cálculo de la nómina void ejecutarCalculoDeLaNomina(); // Calcular el impuesto void calcularImpuesto(); // Renderizar la imagen void renderizarImagen(); 7. // Totalizar los costos de las llamadas 8. void totalizarCostosDeLasLlamadas()
    65. 65. 1. 2. void ejecutarCalculoDeLaNomina(); 3. 4. void calcularImpuesto(); 5. 6. void renderizarImagen(); 7. 8. void totalizarCostosDeLasLlamadas()
    66. 66. 1. void ejecutarCalculoDeLaNomina(); 2. void calcularImpuesto(); 3. void renderizarImagen(); 4. void totalizarCostosDeLasLlamadas()
    67. 67. Simplificando estructuras de decisión
    68. 68. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. class Taximetro { ... double calcularCostoDelViaje() { if (hora > 22:00 || hora < 06:00) { return distancia * 3.90; } else { return distancia * 2.10; } } ...
    69. 69. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. class Taximetro { ... double calcularCostoDelViaje() { if () { return distancia * 3.90; } else { return distancia * 2.10; } } ...
    70. 70. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. class Taximetro { ... double calcularCostoDelViaje() { if (esBandeiraDos()) { return distancia * 3.90; } else { return distancia * 2.10; } } ...
    71. 71. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... double calcularCostoDelViaje() { if (esBandeiraDos()) { return distancia * 3.90; } else { return distancia * 2.10; } Boolean esBandeiraDos() { return hora > 22:00 || hora < 06:00; } ...
    72. 72. ¿Cuales son las ventajas de la modificación?
    73. 73. ¿Cómo sería una prueba automatizada antes de la refactorización?
    74. 74. 1. 2. 3. 4. 5. 6. 7. public class TaximetroPrueba { public void debeSerBanderaDos() { } }
    75. 75. 1. 2. 3. 4. 5. 6. 7. 8. public class TaximetroPrueba { public void debeSerBanderaDos() { Taximetro taximetro = new Taximetro(); } }
    76. 76. 1. 2. 3. 4. 5. 6. 7. 8. 9. public class TaximetroPrueba { public void debeSerBanderaDos() { Taximetro taximetro = new Taximetro(); taximetro.iniciar(23horas()); } }
    77. 77. 1. public class TaximetroPrueba { 2. 3. public void debeSerBanderaDos() { 4. Taximetro taximetro = new Taximetro(); 5. taximetro.iniciar(23horas()); 6. taximetro.distanciaRecorridaEnKM(3.45); 7. } 8. 9. } 10.
    78. 78. 1. public class TaximetroPrueba { 2. 3. public void debeSerBanderaDos() { 4. Taximetro taximetro = new Taximetro(); 5. taximetro.iniciar(23horas()); 6. taximetro.distanciaRecorridaEnKM(3.45); 7. double costo = taximetro.calcularCostoDelViaje(); 8. } 9. 10. } 11.
    79. 79. 1. public class TaximetroPrueba { 2. 3. public void debeSerBanderaDos() { 4. Taximetro taximetro = new Taximetro(); 5. taximetro.iniciar(23horas()); 6. taximetro.distanciaRecorridaEnKM(3.45); 7. double costo = taximetro.calcularCostoDelViaje(); 8. assertEquals(23.45, costo); 9. } 10. 11. } 12.
    80. 80. ¿Y depués?
    81. 81. 1. 2. 3. 4. 5. 6. 7. public class TaximetroPrueba { public void debeSerBanderaDos() { } }
    82. 82. 1. 2. 3. 4. 5. 6. 7. 8. public class TaximetroPrueba { public void debeSerBanderaDos() { Taximetro taximetro = new Taximetro(); } }
    83. 83. 1. 2. 3. 4. 5. 6. 7. 8. 9. public class TaximetroPrueba { public void debeSerBanderaDos() { Taximetro taximetro = new Taximetro(); taximetro.iniciar(23horas()); } }
    84. 84. 1. public class TaximetroPrueba { 2. 3. public void debeSerBanderaDos() { 4. Taximetro taximetro = new Taximetro(); 5. taximetro.iniciar(23horas()); 6. assertTrue(taximetro.esBandeiraDos()); 7. } 8. 9. } 10.
    85. 85. Magic numbers
    86. 86. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... double calcularCostoDelViaje() { if (esBandeiraDos()) { return distancia * 3.90; } else { return distancia * 2.10; } Boolean esBandeiraDos() { return hora > 22:00 || hora < 06:00; } ...
    87. 87. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... double calcularCostoDelViaje() { if (esBandeiraDos()) { return distancia * ; } else { return distancia * ; } Boolean esBandeiraDos() { return hora > 22:00 || hora < 06:00; } ...
    88. 88. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... double calcularCostoDelViaje() { if (esBandeiraDos()) { return distancia * COSTO_BANDERA_2; } else { return distancia * COSTO_BANDERA_1; } Boolean esBandeiraDos() { return hora > 22:00 || hora < 06:00; } ...
    89. 89. Saindo do labirinto
    90. 90. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return distancia * COSTO_BANDERA_2; 4. } else { 5. return distancia * COSTO_BANDERA_1; 6. }
    91. 91. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return distancia * COSTO_BANDERA_2; 4. } else { 5. if (esDomingo()) { 6. return distancia * COSTO_DOMINGO; 7. } else { 8. return distancia * COSTO_BANDERA_1; 9. } 10. }
    92. 92. Distancia del borde
    93. 93. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return distancia * COSTO_BANDERA_2; 4. } else { 5. if (esDomingo()) { 6. return distancia * COSTO_DOMINGO; 7. } else { 8. return distancia * COSTO_BANDERA_1; 9. } 10. } 11. }
    94. 94. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return distancia * COSTO_BANDERA_2; 4. } 5. if (esDomingo()) { 6. return distancia * COSTO_DOMINGO; 7. } else { 8. return distancia * COSTO_BANDERA_1; 9. } 10. 11. }
    95. 95. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return distancia * COSTO_BANDERA_2; 4. } 5. if (esDomingo()) { 6. return distancia * COSTO_DOMINGO; 7. } else { 8. return distancia * COSTO_BANDERA_1; 9. } 10. 11. }
    96. 96. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return distancia * COSTO_BANDERA_2; 4. } 5. if (esDomingo()) { 6. return distancia * COSTO_DOMINGO; 7. } else { 8. return distancia * COSTO_BANDERA_1; 9. } 10. } 11.
    97. 97. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return distancia * COSTO_BANDERA_2; 4. } 5. if (esDomingo()) { 6. return distancia * COSTO_DOMINGO; 7. } 8. return distancia * COSTO_BANDERA_1; 9. 10. } 11.
    98. 98. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return distancia * COSTO_BANDERA_2; 4. } 5. if (esDomingo()) { 6. return distancia * COSTO_DOMINGO; 7. } 8. return distancia * COSTO_BANDERA_1; 9. } 10. 11.
    99. 99. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return distancia * COSTO_BANDERA_2; 4. } 5. if (esDomingo()) { 6. return distancia * COSTO_DOMINGO; 7. } 8. return distancia * COSTO_BANDERA_1; 9. } 10. 11.
    100. 100. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return; 4. } 5. if (esDomingo()) { 6. return; 7. } 8. return; 9. } 10. 11.
    101. 101. 1. double calcularCostoDelViaje() { 2. if (esBandeiraDos()) { 3. return calcularBanderaDos(distancia); 4. } 5. if (esDomingo()) { 6. return calcularDomingo(distancia); 7. } 8. return calcularBanderaUno(distancia); 9. } 10. 11.
    102. 102. 1. double calcularCostoDelViaje() { 2. 3. 4. 5. } if (esBandeiraDos()) return calcularBanderaDos(distancia); if (esDomingo()) return calcularDomingo(distancia); return calcularBanderaUno(distancia);
    103. 103. 1. double calcularCostoDelViaje() { 2. 3. 4. 5. 6. } if (esBandeiraDos()) return calcularBanderaDos(distancia); if (esDomingo()) return calcularDomingo(distancia); return calcularBanderaUno(distancia);
    104. 104. 1. double calcularCostoDelViaje() { 2. 3. 4. 5. 6. } if (esBandeiraDos()) return calcularBanderaDos(distancia); if (esBandeiraTres()) return calcularBanderaTres(distancia); if (esDomingo()) return calcularDomingo(distancia); return calcularBanderaUno(distancia);
    105. 105. ¿Miedo de estropear algo?
    106. 106. Test-Driven Development
    107. 107. Ahorre tiempo y diñero, pruebe más temprano!
    108. 108. Herramientas – Hudson + Sonar

    ×