Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
www.sgcampus.com.mx 
Por Jorge Jiménez y Fernando Arana 
@sgcampus 
TDD y Clean Code 
www.sgcampus.com.mx @sgcampus
BAD CODE 
¿Quién se identifica con esto? 
xkcd.com 
www.sgcampus.com.mx @sgcampus
BAD CODE 
O peor… ¿A quién le ha pasado? 
www.sgcampus.com.mx @sgcampus
BAD CODE 
Y entonces… 
www.sgcampus.com.mx @sgcampus
¿Existe alguna solución? 
¿Extensos estándares? 
¿Documentación? 
¿Poner extremo cuidado? 
¿Análisis estático de código? 
...
Test Drive Development 
www.sgcampus.com.mx @sgcampus
Test Drive Development 
“No soy un gran programador. Sólo 
soy un buen programador con 
grandes hábitos” 
―Kent Beck 
Inve...
Test Drive Development 
TDD es una técnica de desarrollo que nació con 
XP (eXtreme Programming) 
Se hace diseño y codif...
Test Drive Development 
Pero antes… 
1. Has una lista de las posibles pruebas que se 
harán al requerimiento 
2. Comienza ...
Test Drive Development 
Consta de 3 pasos: 
1. Escribes una prueba que falla 
2. Escribes el MÍNIMO código productivo que ...
Clean Code 
“Sabes que estás trabajando con Código Limpio 
cuando cada rutina que lees resulta ser 
exactamente lo que esp...
Clean Code 
www.sgcampus.com.mx @sgcampus
Clean Code 
Mapa Mental por 
Gustavo García en 
base a los videos de 
cleancoders.com 
www.sgcampus.com.mx @sgcampus
Clean Code 
Nombres: 
Los nombres deben reflejar su intención 
Deben poder pronunciarse 
Usar nombres de acuerdo a las ...
Clean Code 
Nombres 
VS 
www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin 
@sgcampus
Clean Code 
Funciones: 
Deben de ser pequeñas 
Y más pequeñas aún: 4 a 6 líneas 
Una función larga puede tener algunas ...
Clean Code 
Formato: 
Comentarios: El mejor comentario es el que no se 
escribe 
Tamaño de archivos: entre más pequeños,...
Clean Code 
www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin 
@sgcampus
¿Qué es una Kata? 
Una Kata es una manera de poner en práctica y 
aprender de manera segura 
En una Kata, el aprendizaje...
Kata Factores Primos 
Prime Factors 
+ generate(n : int) 
Escribe un clase llamada “PrimeFactors” que tiene 
un método est...
Junit 
@Test 
public void dadoUno_regresaVacio() throws Exception { 
FactoresPrimos factorador = new FactoresPrimos(); 
Li...
Junit 
@Test 
public void dadoUno_regresaVacio() throws Exception { 
FactoresPrimos factorador = new FactoresPrimos(); 
Li...
Junit 
private FactoresPrimos factorador; 
@Test 
public void setUp() throws Exception { 
this.factorador = new FactoresPr...
Junit 
public void dadoDos_regresaListaConSoloDos() throws Exception { 
List<Integer> factores = factorador.buscarFactores...
Junit 
public void dadoTres_regresaListaConSoloTres() throws Exception { 
assertEquals(1, factores.size()); 
assertEquals(...
Junit 
private void assertFactoresPrimos(int numeroAEvaluar) { 
List<Integer> factores = 
factorador.buscarFactoresPrimos(...
public List<Integer> buscarFactoresPrimos(int numero) { 
ArrayList<Integer> listaDeFactores = new ArrayList<Integer>(); 
f...
Junit 
List<Integer> factores = factorador.buscarFactoresPrimos(4); 
assertEquals(2, factores.size()); 
assertEquals(2, fa...
public class FactoresPrimos { 
private static final int PRIMER_FACTOR_PRIMO = 2; 
public List<Integer> buscarFactoresPrimo...
Productivo 
public class FactoresPrimos { 
private static final int PRIMER_FACTOR_PRIMO = 2; 
public List<Integer> buscarF...
Junit 
private void assertFactoresPrimos(final int numeroAEvaluar, final int... valores) { 
final List<Integer> factores =...
Junit 
public void dadoCinco_regresaCinco() throws Exception { 
Productivo 
@Test 
assertFactoresPrimos(5, 5); 
} 
Pasa 
w...
Junit 
private void assertFactoresPrimos(final int numeroAEvaluar, final int... valores) 
private void assertNumeroGeneraF...
Junit 
assertNumeroGeneraFactoresPrimos(7, 7); 
assertNumeroGeneraFactoresPrimos(8, 2, 2, 2); 
assertNumeroGeneraFactoresP...
Conclusiones 
Utilizando TDD y Clean Code tendremos los siguientes 
beneficios: 
Seguridad al modificar código (red de pr...
Clean Code 
“Deja el código mejor de cómo lo encontraste” 
www.sgcampus.com.mx @sgcampus
Bibliografía 
 Clean code: A Handbook of Agile Software Craftsmanship 
www.sgcampus.com.mx Fuente: libro “Clean Code” por...
Upcoming SlideShare
Loading in …5
×

Tdd y clean code SG campus

741 views

Published on

Kent Beck dice “No sé si soy un gran programador, pero definitivamente son un programador con grandes prácticas”. ¿Cuáles son estas grandes prácticas? Test Drive Development y Clean Code son dos de ellas. La adopción de estas prácticas nos ayuda como programadores para que perdamos el miedo a usar código nuevo y confiemos en nuestros compañeros de equipo. También ayuda a reducir la tan odiada documentación o peor, tener documentación incorrecta (como comentarios obsoletos) . Esta presentación incluye una demostración de TDD en Java.

Published in: Technology

Tdd y clean code SG campus

  1. 1. www.sgcampus.com.mx Por Jorge Jiménez y Fernando Arana @sgcampus TDD y Clean Code www.sgcampus.com.mx @sgcampus
  2. 2. BAD CODE ¿Quién se identifica con esto? xkcd.com www.sgcampus.com.mx @sgcampus
  3. 3. BAD CODE O peor… ¿A quién le ha pasado? www.sgcampus.com.mx @sgcampus
  4. 4. BAD CODE Y entonces… www.sgcampus.com.mx @sgcampus
  5. 5. ¿Existe alguna solución? ¿Extensos estándares? ¿Documentación? ¿Poner extremo cuidado? ¿Análisis estático de código? ¿Inspecciones? ¿Pedir la bendición para el código productivo? www.sgcampus.com.mx @sgcampus
  6. 6. Test Drive Development www.sgcampus.com.mx @sgcampus
  7. 7. Test Drive Development “No soy un gran programador. Sólo soy un buen programador con grandes hábitos” ―Kent Beck Inventor de TDD www.sgcampus.com.mx @sgcampus
  8. 8. Test Drive Development TDD es una técnica de desarrollo que nació con XP (eXtreme Programming) Se hace diseño y codificación guiado por las pruebas unitarias Con TDD podemos lograr que el diseño “emerja” del código www.sgcampus.com.mx @sgcampus
  9. 9. Test Drive Development Pero antes… 1. Has una lista de las posibles pruebas que se harán al requerimiento 2. Comienza con las pruebas más sencillas 3. Aquellas que rodean el requerimiento 4. DETÉN el impulso de programar todas las reglas de negocio en una sola vez www.sgcampus.com.mx @sgcampus
  10. 10. Test Drive Development Consta de 3 pasos: 1. Escribes una prueba que falla 2. Escribes el MÍNIMO código productivo que hace que la prueba pase 3. Haces Refactor usando Clean Code www.sgcampus.com.mx @sgcampus
  11. 11. Clean Code “Sabes que estás trabajando con Código Limpio cuando cada rutina que lees resulta ser exactamente lo que esperabas de ella” -Ward Cunningan “Sabes que ves un Código Limpio cuando: • Corren todas las pruebas • No tiene código duplicado • Expresa todas las ideas que tiene el sistema • Minimiza el número de entidades como clases, métodos, y funciones” -Ron Jeffries www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin @sgcampus
  12. 12. Clean Code www.sgcampus.com.mx @sgcampus
  13. 13. Clean Code Mapa Mental por Gustavo García en base a los videos de cleancoders.com www.sgcampus.com.mx @sgcampus
  14. 14. Clean Code Nombres: Los nombres deben reflejar su intención Deben poder pronunciarse Usar nombres de acuerdo a las reglas de negocio Evitar encodings (prefijos, tipos de datos) Algunas reglas de nombrado: Clases = Sustantivos Variables = Nombres Métodos = Verbos Booleanos = “is” o “has” www.sgcampus.com.mx @sgcampus
  15. 15. Clean Code Nombres VS www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin @sgcampus
  16. 16. Clean Code Funciones: Deben de ser pequeñas Y más pequeñas aún: 4 a 6 líneas Una función larga puede tener algunas clases escondidas No pasar más de 2 argumentos Extraer hasta no poder extraer más, así aseguramos un nivel de abstracción “FUNCTIONS SHOULD DO ONE THING. THEY SHOULD DO IT WELL. THEY SHOULD DO IT ONLY” www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin @sgcampus
  17. 17. Clean Code Formato: Comentarios: El mejor comentario es el que no se escribe Tamaño de archivos: entre más pequeños, mejor Formato Vertical: uniformidad en interlineado, sangría, ciclos, etc. Step Down Rule: Organizar métodos del más abstracto al más específico. El código debe entenderse en secuencia de arriba hacia abajo www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin @sgcampus
  18. 18. Clean Code www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin @sgcampus
  19. 19. ¿Qué es una Kata? Una Kata es una manera de poner en práctica y aprender de manera segura En una Kata, el aprendizaje es más importante que el resultado (es decir, no importa si el programa “no jala” o se queda incompleto) Por eso, las Katas se tienen que hacer más de una vez www.sgcampus.com.mx @sgcampus
  20. 20. Kata Factores Primos Prime Factors + generate(n : int) Escribe un clase llamada “PrimeFactors” que tiene un método estático: generate El método generate toma un argumento entero y regresa una lista de enteros “List<Integer>” Esta lista contiene los factores primos en secuencia numérica. www.sgcampus.com.mx @sgcampus
  21. 21. Junit @Test public void dadoUno_regresaVacio() throws Exception { FactoresPrimos factorador = new FactoresPrimos(); List<Integer> factores = factorador.buscarFactoresPrimos(1); assertEquals(0, factores.size()); Productivo } public class FactoresPrimos { public List<Integer>buscarFactoresPrimos(int i) { return null; } } www.sgcampus.com.mx @sgcampus
  22. 22. Junit @Test public void dadoUno_regresaVacio() throws Exception { FactoresPrimos factorador = new FactoresPrimos(); List<Integer> factores = factorador.buscarFactoresPrimos(1); assertEquals(0, factores.size()); www.sgcampus.com.mx @sgcampus } Productivo public class FactoresPrimos { public List<Integer>buscarFactoresPrimos(int i) { return new ArrayList<Integer>(); } }
  23. 23. Junit private FactoresPrimos factorador; @Test public void setUp() throws Exception { this.factorador = new FactoresPrimos(); } @Test public void dadoUno_regresaVacio() throws Exception { List<Integer> factores = factorador.buscarFactoresPrimos(1); assertEquals(0, factores.size()); } www.sgcampus.com.mx @sgcampus
  24. 24. Junit public void dadoDos_regresaListaConSoloDos() throws Exception { List<Integer> factores = factorador.buscarFactoresPrimos(2); assertEquals(1, factores.size()); assertEquals(2, factores.get(0).intValue()); Productivo @Test } public List<Integer> buscarFactoresPrimos(int numero) { ArrayList<Integer> listaDeFactores = new ArrayList<Integer>(); if (numero > 1) { listaDeFactores.add(2); } return listaDeFactores; } www.sgcampus.com.mx @sgcampus
  25. 25. Junit public void dadoTres_regresaListaConSoloTres() throws Exception { assertEquals(1, factores.size()); assertEquals(3, factores.get(0).intValue()); Productivo @Test List<Integer> factores = factorador.buscarFactoresPrimos(3); } public List<Integer> buscarFactoresPrimos(int numero) { ArrayList<Integer> listaDeFactores = new ArrayList<Integer>(); if (numero % 2 == 0) { listaDeFactores.add(2); } else if (numero % 3 == 0) { listaDeFactores.add(3); } return listaDeFactores; } www.sgcampus.com.mx @sgcampus
  26. 26. Junit private void assertFactoresPrimos(int numeroAEvaluar) { List<Integer> factores = factorador.buscarFactoresPrimos(numeroAEvaluar); assertEquals(1, factores.size()); assertEquals(numeroAEvaluar, factores.get(0).intValue()); } @Test public void dadoDos_regresaListaConSoloDos() throws Exception { assertFactoresPrimos(2); } @Test public void dadoTres_regresaListaConSoloTres() throws Exception { assertFactoresPrimos(3); } www.sgcampus.com.mx @sgcampus
  27. 27. public List<Integer> buscarFactoresPrimos(int numero) { ArrayList<Integer> listaDeFactores = new ArrayList<Integer>(); for (int primo = 2; primo <= numero; primo++) { añadirPrimo(listaDeFactores, primo, numero); } return listaDeFactores; www.sgcampus.com.mx @sgcampus } private void añadirPrimo(ArrayList<Integer> listaDeFactores, int primo, int numero) { if (numero % primo == 0) { listaDeFactores.add(primo); } } Productivo
  28. 28. Junit List<Integer> factores = factorador.buscarFactoresPrimos(4); assertEquals(2, factores.size()); assertEquals(2, factores.get(0).intValue()); assertEquals(2, factores.get(1).intValue()); Productivo @Test public void dadoCuatro_regresaDosYDos() throws Exception { } public List<Integer> buscarFactoresPrimos(int numero) { int aEvaluar = numero; final ArrayList<Integer> listaDeFactores = new ArrayList<Integer>(); for (int primo = 2; primo <= aEvaluar;) { if (numero % primo == 0) { listaDeFactores.add(primo); aEvaluar = aEvaluar / primo; } else { primo++; } } return listaDeFactores; www.sgcampus.com.mx @sgcampus } }
  29. 29. public class FactoresPrimos { private static final int PRIMER_FACTOR_PRIMO = 2; public List<Integer> buscarFactoresPrimos(final int numero) { siguientesFatoresPrimos(listaDeFactores, PRIMER_FACTOR_PRIMO, numero); return listaDeFactores; } private void siguientesFatoresPrimos(final ArrayList<Integer> listaDeFactores, final int primo, final int numero) { if (primo <= numero) { evaluaFactorPrimo(listaDeFactores, primo, numero); } } private void evaluaFactorPrimo(final ArrayList<Integer> listaDeFactores, final int primo, final int numero) { if (numero % primo == 0) { listaDeFactores.add(primo); siguientesFatoresPrimos(listaDeFactores, primo, numero / www.sgcampus.com.mx @sgcampus primo); } else { siguientesFatoresPrimos(listaDeFactores, primo + 1, numero); } } } Productivo
  30. 30. Productivo public class FactoresPrimos { private static final int PRIMER_FACTOR_PRIMO = 2; public List<Integer> buscarFactoresPrimos(final int numero) { siguientesFatoresPrimos(listaDeFactores, PRIMER_FACTOR_PRIMO, numero); return listaDeFactores; www.sgcampus.com.mx @sgcampus } private void siguientesFatoresPrimos(final ArrayList<Integer> listaDeFactores, final int primo, final int numero) { if (primo <= numero) { evaluaFactorPrimo(listaDeFactores, primo, numero); } } private void evaluaFactorPrimo(final ArrayList<Integer> listaDeFactores, final int primo, final int numero) { if (numero % primo == 0) { listaDeFactores.add(primo); siguientesFatoresPrimos(listaDeFactores, primo, numero / primo); } else { siguientesFatoresPrimos(listaDeFactores, primo + 1, numero); } } }
  31. 31. Junit private void assertFactoresPrimos(final int numeroAEvaluar, final int... valores) { final List<Integer> factores = factorador.buscarFactoresPrimos(numeroAEvaluar); assertEquals(valores.length, factores.size()); for (int i = 0; i < valores.length; i++) { assertEquals(valores[i], factores.get(i).intValue()); } www.sgcampus.com.mx @sgcampus } @Test public void dadoUno_regresaVacio() throws Exception { assertFactoresPrimos(1); } @Test public void dadoDos_regresaListaConSoloDos() throws Exception { assertFactoresPrimos(2, 2); } @Test public void dadoTres_regresaListaConSoloTres() throws Exception { assertFactoresPrimos(3, 3); } @Test public void dadoCuatro_regresaDosYDos() throws Exception { assertFactoresPrimos(4, 2, 2); }
  32. 32. Junit public void dadoCinco_regresaCinco() throws Exception { Productivo @Test assertFactoresPrimos(5, 5); } Pasa www.sgcampus.com.mx @sgcampus
  33. 33. Junit private void assertFactoresPrimos(final int numeroAEvaluar, final int... valores) private void assertNumeroGeneraFactoresPrimos(final int numeroAEvaluar, final int... valores) @Test public void dadoUno_regresaVacio() throws Exception { assertFactoresPrimos(1); } @Test public void dadoDos_regresaListaConSoloDos() throws Exception { assertFactoresPrimos(2, 2); } @Test public void dadoTres_regresaListaConSoloTres() throws Exception { assertFactoresPrimos(3, 3); } @Test public void dadoCuatro_regresaDosYDos() throws Exception { assertFactoresPrimos(4, 2, 2); } @Test public void dadoCinco_regresaCinco() throws Exception { assertFactoresPrimos(5, 5); } public void dadoNumero_regresaSusFacotresPrimos() throws Exception { assertNumeroGeneraFactoresPrimos(1); assertNumeroGeneraFactoresPrimos(2, 2); assertNumeroGeneraFactoresPrimos(3, 3); assertNumeroGeneraFactoresPrimos(4, 2, 2); assertNumeroGeneraFactoresPrimos(5, 5); www.sgcampus.com.mx @sgcampus }
  34. 34. Junit assertNumeroGeneraFactoresPrimos(7, 7); assertNumeroGeneraFactoresPrimos(8, 2, 2, 2); assertNumeroGeneraFactoresPrimos(11, 11); assertNumeroGeneraFactoresPrimos(2 * 3 * 5 * 7 * 11 * 13 * 17, 2, 3, 5, 7, 11, 13, 17); Productivo assertNumeroGeneraFactoresPrimos(6, 2, 3); Pasan www.sgcampus.com.mx @sgcampus
  35. 35. Conclusiones Utilizando TDD y Clean Code tendremos los siguientes beneficios: Seguridad al modificar código (red de protección de pruebas unitarias) Código mantenible para poder arreglar bugs o implementar nuevos features Mejor trabajo en equipo (¡por fin nos entendemos!) Clientes satisfechos Estimaciones más certeras Enfocarnos en cosas más interesantes: nuevos frameworks, Clean Architecture, Patrones, Sistemas resistentes a fallos, Escalabilidad… www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin @sgcampus
  36. 36. Clean Code “Deja el código mejor de cómo lo encontraste” www.sgcampus.com.mx @sgcampus
  37. 37. Bibliografía  Clean code: A Handbook of Agile Software Craftsmanship www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin @sgcampus (Robert C. Martin)  Test Driven Development: By Example (Kent Beck)  Refactoring: Improving the Design of Existing Code (Martin Fowler)  Working Effectively with Legacy Code (Michael Feathers)  The Clean Coder: A Code of Conduct for Professional Programmers (Robert C. Martin)  The Coding Dojo Handbook (Emily Bache)  CleanCoders.com

×