SlideShare ist ein Scribd-Unternehmen logo
1 von 37
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? 
¿Inspecciones? 
¿Pedir la bendición para el código productivo? 
www.sgcampus.com.mx @sgcampus
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 
Inventor de TDD 
www.sgcampus.com.mx @sgcampus
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
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
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
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
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 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
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 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
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
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 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
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
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
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>(); 
} 
}
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
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
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
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
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
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 
} 
}
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
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); 
} 
} 
}
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); 
}
Junit 
public void dadoCinco_regresaCinco() throws Exception { 
Productivo 
@Test 
assertFactoresPrimos(5, 5); 
} 
Pasa 
www.sgcampus.com.mx @sgcampus
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 
}
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
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
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 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

Weitere ähnliche Inhalte

Was ist angesagt?

4. Programación con arrays, funciones, y objetos definidos por el usuario
4. Programación con arrays, funciones, y objetos definidos por el usuario4. Programación con arrays, funciones, y objetos definidos por el usuario
4. Programación con arrays, funciones, y objetos definidos por el usuarioLaura Folgado Galache
 
6 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 20096 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 2009Pepe
 
3. Utilización de los objetos predefinidos del lenguaje
3. Utilización de los objetos predefinidos del lenguaje3. Utilización de los objetos predefinidos del lenguaje
3. Utilización de los objetos predefinidos del lenguajeLaura Folgado Galache
 
SCJP, Clase 3: Asignaciones
SCJP, Clase 3: AsignacionesSCJP, Clase 3: Asignaciones
SCJP, Clase 3: Asignacionesflekoso
 
SCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de FlujoSCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de Flujoflekoso
 
SCJP, Clase 6: Collections
SCJP, Clase 6: CollectionsSCJP, Clase 6: Collections
SCJP, Clase 6: Collectionsflekoso
 
Sesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientosSesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientosSantos Rivera Luján
 
Ejercicios de programacion concurrente
Ejercicios de programacion concurrenteEjercicios de programacion concurrente
Ejercicios de programacion concurrenteedgar muñoz
 
Java problems
Java problemsJava problems
Java problemsNoe Lopez
 

Was ist angesagt? (20)

Ciclo while y do while
Ciclo while y do whileCiclo while y do while
Ciclo while y do while
 
4. Programación con arrays, funciones, y objetos definidos por el usuario
4. Programación con arrays, funciones, y objetos definidos por el usuario4. Programación con arrays, funciones, y objetos definidos por el usuario
4. Programación con arrays, funciones, y objetos definidos por el usuario
 
6 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 20096 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 2009
 
3. Utilización de los objetos predefinidos del lenguaje
3. Utilización de los objetos predefinidos del lenguaje3. Utilización de los objetos predefinidos del lenguaje
3. Utilización de los objetos predefinidos del lenguaje
 
Semana 2 Fundamentos de Python(Ciclos y Listas)
Semana 2   Fundamentos de Python(Ciclos y Listas)Semana 2   Fundamentos de Python(Ciclos y Listas)
Semana 2 Fundamentos de Python(Ciclos y Listas)
 
Semana 7 Proyecto Misión TIC 2022
Semana 7 Proyecto Misión TIC 2022Semana 7 Proyecto Misión TIC 2022
Semana 7 Proyecto Misión TIC 2022
 
Programación Java
Programación JavaProgramación Java
Programación Java
 
Ciclos
CiclosCiclos
Ciclos
 
Programa 17
Programa 17Programa 17
Programa 17
 
SCJP, Clase 3: Asignaciones
SCJP, Clase 3: AsignacionesSCJP, Clase 3: Asignaciones
SCJP, Clase 3: Asignaciones
 
SCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de FlujoSCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de Flujo
 
Personalizar gui guia_3
Personalizar gui guia_3Personalizar gui guia_3
Personalizar gui guia_3
 
Prog ii excepciones_guia_04
Prog ii excepciones_guia_04Prog ii excepciones_guia_04
Prog ii excepciones_guia_04
 
SCJP, Clase 6: Collections
SCJP, Clase 6: CollectionsSCJP, Clase 6: Collections
SCJP, Clase 6: Collections
 
Resumen java
Resumen javaResumen java
Resumen java
 
Prog_II_Eventos_guia_2
Prog_II_Eventos_guia_2Prog_II_Eventos_guia_2
Prog_II_Eventos_guia_2
 
Programa 19
Programa 19Programa 19
Programa 19
 
Sesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientosSesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientos
 
Ejercicios de programacion concurrente
Ejercicios de programacion concurrenteEjercicios de programacion concurrente
Ejercicios de programacion concurrente
 
Java problems
Java problemsJava problems
Java problems
 

Ähnlich wie Tdd y clean code SG campus

UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)Videoconferencias UTPL
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...jaircazarin
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
Tutorial JPA Parte 1 : CRUD BASICO CON JPA Y SWING en NETBEANS
Tutorial  JPA Parte 1  : CRUD BASICO CON JPA Y SWING en NETBEANSTutorial  JPA Parte 1  : CRUD BASICO CON JPA Y SWING en NETBEANS
Tutorial JPA Parte 1 : CRUD BASICO CON JPA Y SWING en NETBEANSWilliam Diaz S
 
¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?Agustin Ramos
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyJose Juan R. Zuñiga
 
Segundo laboratorio de Android
Segundo laboratorio de AndroidSegundo laboratorio de Android
Segundo laboratorio de AndroidGDG Cali
 
Lo básico para programar
Lo básico para programarLo básico para programar
Lo básico para programarCelestino Duran
 
Metodos,variables, pasodeparametros
Metodos,variables, pasodeparametrosMetodos,variables, pasodeparametros
Metodos,variables, pasodeparametroskenixxx
 
Trabajando con Procedimientos Almacenados y VB.Net
Trabajando con Procedimientos Almacenados y VB.NetTrabajando con Procedimientos Almacenados y VB.Net
Trabajando con Procedimientos Almacenados y VB.NetAlberto Navarro Sorolla
 
Semana 1 - Principios de Algoritmos.pdf
Semana 1 - Principios de Algoritmos.pdfSemana 1 - Principios de Algoritmos.pdf
Semana 1 - Principios de Algoritmos.pdfCarlosJahnsen3
 
Lo básico para programar
Lo básico para programarLo básico para programar
Lo básico para programarCelestino Duran
 
sentenciareturnymetodos
sentenciareturnymetodossentenciareturnymetodos
sentenciareturnymetodosLao Tobon
 

Ähnlich wie Tdd y clean code SG campus (20)

UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Tutorial JPA Parte 1 : CRUD BASICO CON JPA Y SWING en NETBEANS
Tutorial  JPA Parte 1  : CRUD BASICO CON JPA Y SWING en NETBEANSTutorial  JPA Parte 1  : CRUD BASICO CON JPA Y SWING en NETBEANS
Tutorial JPA Parte 1 : CRUD BASICO CON JPA Y SWING en NETBEANS
 
Viernes Tecnicos DTrace
Viernes Tecnicos DTraceViernes Tecnicos DTrace
Viernes Tecnicos DTrace
 
¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
algoritmos distribuidos
algoritmos distribuidosalgoritmos distribuidos
algoritmos distribuidos
 
Módulo 2
Módulo 2Módulo 2
Módulo 2
 
Semana 1 Estructuras de Control en Java
Semana 1   Estructuras de Control en JavaSemana 1   Estructuras de Control en Java
Semana 1 Estructuras de Control en Java
 
Segundo laboratorio de Android
Segundo laboratorio de AndroidSegundo laboratorio de Android
Segundo laboratorio de Android
 
Lo básico para programar
Lo básico para programarLo básico para programar
Lo básico para programar
 
Metodos,variables, pasodeparametros
Metodos,variables, pasodeparametrosMetodos,variables, pasodeparametros
Metodos,variables, pasodeparametros
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Python
 
Trabajando con Procedimientos Almacenados y VB.Net
Trabajando con Procedimientos Almacenados y VB.NetTrabajando con Procedimientos Almacenados y VB.Net
Trabajando con Procedimientos Almacenados y VB.Net
 
Symfony parte 16
Symfony parte 16Symfony parte 16
Symfony parte 16
 
Semana 1 - Principios de Algoritmos.pdf
Semana 1 - Principios de Algoritmos.pdfSemana 1 - Principios de Algoritmos.pdf
Semana 1 - Principios de Algoritmos.pdf
 
Lo básico para programar
Lo básico para programarLo básico para programar
Lo básico para programar
 
Reportes Java
Reportes JavaReportes Java
Reportes Java
 
sentenciareturnymetodos
sentenciareturnymetodossentenciareturnymetodos
sentenciareturnymetodos
 

Mehr von Software Guru

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasSoftware Guru
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesSoftware Guru
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environmentsSoftware Guru
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorSoftware Guru
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealSoftware Guru
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowSoftware Guru
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:Software Guru
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learningSoftware Guru
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDiSoftware Guru
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Software Guru
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSSoftware Guru
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...Software Guru
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?Software Guru
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Software Guru
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsSoftware Guru
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosSoftware Guru
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressSoftware Guru
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsSoftware Guru
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Software Guru
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoSoftware Guru
 

Mehr von Software Guru (20)

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las Cosas
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso reales
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environments
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador Senior
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto ideal
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache Airflow
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learning
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDi
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJS
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOps
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stress
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goals
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseño
 

Kürzlich hochgeladen

Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxFederico Castellari
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIhmpuellon
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativanicho110
 

Kürzlich hochgeladen (12)

Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 

Tdd y clean code SG campus

  • 1. www.sgcampus.com.mx Por Jorge Jiménez y Fernando Arana @sgcampus TDD y Clean Code www.sgcampus.com.mx @sgcampus
  • 2. BAD CODE ¿Quién se identifica con esto? xkcd.com www.sgcampus.com.mx @sgcampus
  • 3. BAD CODE O peor… ¿A quién le ha pasado? www.sgcampus.com.mx @sgcampus
  • 4. BAD CODE Y entonces… www.sgcampus.com.mx @sgcampus
  • 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. Test Drive Development www.sgcampus.com.mx @sgcampus
  • 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. 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. 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. 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. 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
  • 13. Clean Code Mapa Mental por Gustavo García en base a los videos de cleancoders.com www.sgcampus.com.mx @sgcampus
  • 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. Clean Code Nombres VS www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin @sgcampus
  • 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. 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. Clean Code www.sgcampus.com.mx Fuente: libro “Clean Code” por Bob Martin @sgcampus
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Junit public void dadoCinco_regresaCinco() throws Exception { Productivo @Test assertFactoresPrimos(5, 5); } Pasa www.sgcampus.com.mx @sgcampus
  • 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. 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. 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. Clean Code “Deja el código mejor de cómo lo encontraste” www.sgcampus.com.mx @sgcampus
  • 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