El pasado martes 5 de agosto tuve la oportunidad de acudir a mi primer meetup de Software Craftsmanship Madrid, en el que se celebaba un coding dojo facilitado por Carlos Ble @carlosble. El objetivo de la sesión era hacer uso de un patrón diseñado por Robert “Uncle Bob” Martin llamado “Transformation Priority Premise” que nos lleva a una programación más genérica y funcional.
Tras sentarnos por parejas y escoger el entorno y el lenguaje de programación (En mi caso, C# con Visual Studio 2013 y XUnit como motor de pruebas) se desveló el objetivo de la kata:
Dada una cadena, devolver, en forma de array, las posiciones de dicha cadena cuyos caracteres sean la letra mayúscula
Ejemplos:
– A: {0}
– bA: {1}
– aBcdE: {1, 4}
Primera iteración, sin restricciones
Para esta primera iteración no teníamos ninguna limitación más allá de intentar resolver la kata. El resultado es el que se muestra en el vídeo:
El código completo, tanto del test como de la implementación se puede ver a continuación:
El enfoque es iterativo, utilizando un bucle para recorrer los caracteres de la cadena y la comprobación es bastante artesanal (a mejorar en la segunda iteración) y además, como teníamos tiempo, pudimos probar las Theories de XUnit, que nos permiten utilizar, en el mismo test, diferentes conjuntos de entrada y esperar diferentes resultados.
Segunda iteración, con restricciones
En esta segunda iteración teníamos una limitación importante: No podíamos asignar variables, ni modificar valores existentes. Esto nos deja sin la posibilidad de usar bucles (ya que vamos actualizando la posición del iterador) y forzando nuestro código a que sea más funcional. El resultado es el que se muestra:
El código completo es el siguiente, con el que intentamos seguir a rajatabla la indicación de no asignar o modificar los valores de las variables. En este caso el tiempo no permitió pasar de unos pocos test, pero se aprecia una diferencia notable por una parte en el test y por otra en el código de implementación:
Como nota adicional, gracias a @DanielRoz0 que me ha estado ayudando con la edición del vídeo, se pudo simplificar la comparación de una letra con su correspondiente mayúscula mediante el uso de la función char.IsUpper(source, index).
Información y enlaces:
- Sobre el método Uncle Bob – The transformation priority premise
- Ven al siguiente Software Craftmanship Madrid en Meetup
Hola Roberto,
Me ha gustado la Kata y no conocía las Theories, así que ya he aprendido dos cosas nuevas hoy :). Una pregunta, pues no he asistido nunca a una Kata presencial y no conozco las reglas. ¿Se pueden aprovechar los Tests ya escritos en la primera iteración?
Gracias!
Hola Juan:
Gracias por el comentario. Las reglas varían según el escenario. He estado en coding dojos en los que se permitía conservar los tests en la siguiente iteración. En este caso, sin embargo, como era un cambio de paradigma, la recomendación fue borrar todo y empezar de cero.
Esta muy bien el video Roberto, gracias por compartir. Aun puedes hacer las transiciones mas suaves para que mantengas los tests todo el rato en verde. Estoy terminando de producir el video donde lo resuelvo yo, te lo pasare para expresar mejor lo que quiero decir.
La TPP no es para hacer el codigo mas generico y funcional, es una sugerencia para que la triangulacion llegue a buen puerto cuando practicamos TDD.
Nos vemos en el proximo dojo :-)
Aqui dejo mi version de la solucion con restricciones:
http://www.carlosble.com/screencasts/es/e6-tdd-con-transformation-priority-premise/