Kata UpperCounter con Software Craftsmanship Madrid

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:

5 pensamientos en “Kata UpperCounter con Software Craftsmanship Madrid

  1. jmservera

    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!

    Responder
    1. Roberto Luis Bisbé Autor de la entrada

      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.

      Responder
  2. Carlos Blé (@carlosble)

    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 :-)

    Responder
  3. Pingback: UpperCounter Kata con LINQ, primera parte - Daniel Rozo Daniel Rozo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s