SlideShare una empresa de Scribd logo
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

Más contenido relacionado

La actualidad más candente

Ciclo while y do while
Ciclo while y do whileCiclo while y do while
Ciclo while y do while
Magda Fernandez
 
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
Laura Folgado Galache
 
6 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 20096 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 2009
Pepe
 
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
Laura Folgado Galache
 
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)
Richard Eliseo Mendoza Gafaro
 
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
Richard Eliseo Mendoza Gafaro
 
Programación Java
Programación JavaProgramación Java
Programación Java
Jano González
 
Ciclos
CiclosCiclos
Programa 17
Programa 17Programa 17
Programa 17
Javier Leon
 
SCJP, Clase 3: Asignaciones
SCJP, Clase 3: AsignacionesSCJP, Clase 3: Asignaciones
SCJP, Clase 3: Asignaciones
flekoso
 
SCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de FlujoSCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de Flujo
flekoso
 
Personalizar gui guia_3
Personalizar gui guia_3Personalizar gui guia_3
Prog ii excepciones_guia_04
Prog ii excepciones_guia_04Prog ii excepciones_guia_04
SCJP, Clase 6: Collections
SCJP, Clase 6: CollectionsSCJP, Clase 6: Collections
SCJP, Clase 6: Collections
flekoso
 
Resumen java
Resumen javaResumen java
Resumen java
Emerson Garay
 
Prog_II_Eventos_guia_2
Prog_II_Eventos_guia_2Prog_II_Eventos_guia_2
Programa 19
Programa 19Programa 19
Programa 19
Javier Leon
 
Sesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientosSesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientos
Santos 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 problems
Noe Lopez
 

La actualidad más candente (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
 

Similar a 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ÍNCRONA
Ví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 NETBEANS
William 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 Groovy
Jose Juan R. Zuñiga
 
algoritmos distribuidos
algoritmos distribuidosalgoritmos distribuidos
algoritmos distribuidos
Yesica Huallpa Laguna
 
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
Richard Eliseo Mendoza Gafaro
 
Segundo laboratorio de Android
Segundo laboratorio de AndroidSegundo laboratorio de Android
Segundo laboratorio de Android
GDG Cali
 
Lo básico para programar
Lo básico para programarLo básico para programar
Lo básico para programar
Celestino Duran
 
Metodos,variables, pasodeparametros
Metodos,variables, pasodeparametrosMetodos,variables, pasodeparametros
Metodos,variables, pasodeparametros
kenixxx
 
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
Alberto Navarro Sorolla
 
Symfony parte 16
Symfony parte 16Symfony parte 16
Symfony parte 16
Rodrigo Miranda
 
Semana 1 - Principios de Algoritmos.pdf
Semana 1 - Principios de Algoritmos.pdfSemana 1 - Principios de Algoritmos.pdf
Semana 1 - Principios de Algoritmos.pdf
CarlosJahnsen3
 
Lo básico para programar
Lo básico para programarLo básico para programar
Lo básico para programar
Celestino Duran
 
Reportes Java
Reportes JavaReportes Java
Reportes Java
Leonardo Del Toro
 
sentenciareturnymetodos
sentenciareturnymetodossentenciareturnymetodos
sentenciareturnymetodos
Lao Tobon
 

Similar a 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
 

Más de 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 Cosas
Software 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 reales
Software Guru
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environments
Software 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 Senior
Software 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 ideal
Software Guru
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache Airflow
Software 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 learning
Software Guru
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDi
Software 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.0
Software 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 StencilJS
Software 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 DevOps
Software 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 productivos
Software 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 stress
Software 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 goals
Software 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 Covid19
Software 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ño
Software Guru
 

Más de 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
 

Último

Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
cofferub
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
marianabz2403
 
Las lámparas de alta intensidad de descarga o lámparas de descarga de alta in...
Las lámparas de alta intensidad de descarga o lámparas de descarga de alta in...Las lámparas de alta intensidad de descarga o lámparas de descarga de alta in...
Las lámparas de alta intensidad de descarga o lámparas de descarga de alta in...
espinozaernesto427
 
Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
SamuelRamirez83524
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
DiegoCampos433849
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
Emilio Casbas
 
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
CesarPazosQuispe
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
cj3806354
 
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
sarasofiamontezuma
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
thomasdcroz38
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
vazquezgarciajesusma
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
PABLOCESARGARZONBENI
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Telefónica
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
JulyMuoz18
 
Ventajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloroVentajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloro
durangense277
 
Desarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdfDesarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdf
samuelvideos
 
Conceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdfConceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdf
ValeriaAyala48
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
zoecaicedosalazar
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
CrystalRomero18
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
cristianrb0324
 

Último (20)

Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
 
Las lámparas de alta intensidad de descarga o lámparas de descarga de alta in...
Las lámparas de alta intensidad de descarga o lámparas de descarga de alta in...Las lámparas de alta intensidad de descarga o lámparas de descarga de alta in...
Las lámparas de alta intensidad de descarga o lámparas de descarga de alta in...
 
Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
 
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
 
Ventajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloroVentajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloro
 
Desarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdfDesarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdf
 
Conceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdfConceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdf
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
 

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