Greeting
Una kata funcional para dominarlas todas
El concepto de función pura me parece muy interesante para Test Driven Development porque nos fuerza a pensar en un comportamiento que debe evolucionar mientas que lo único que podemos saber sobre él desde el punto de vista del test son sus inputs y sus outputs actuales. Esto es común a todo desarrollo en TDD clásico, dado que se basa en tests de caja negra. O sea, no tenemos en cuenta cómo es la implementación de la unidad que estamos desarrollando, sino cómo interactuamos con ella a través de su interfaz pública.
Por eso te la propongo como ejercicio final de esta serie, porque ayuda a ejercitar todas las cosas que hemos aprendido con las anteriores, añadiendo una restricción extra para forzarnos a no utilizar los recursos de que dispondríamos en orientación a objetos, como podría ser mantener un estado o extrayendo comportamiento a dependencias.
Además, dado que los requisitos cambian en cada iteración, nos fuerza a hacer refactors constantemente para poder introducir los cambios necesarios de comportamiento.
Historia
Esta kata no es muy conocida. La he encontrado en TestDouble, donde se menciona como autor a Nick Gauthier.
Enunciado
El enunciado de esta kata es muy simple. Se trata de crear una función pura greet() que devuelva un string con un saludo. Se le pasa como parámetro el nombre de la persona a la que saludar.
Seguidamente, se van añadiendo requisitos que nos obligarán a extender el algoritmo para darles soporte únicamente a través de la entrada y salida de esta función. Para cada requisito se nos proporciona un ejemplo. Son los siguientes:
| Requisitos | input | output |
|---|---|---|
| 1. Interpolar nombre en un saludo sencillo | “Bob” | Hello, Bob. |
| 2. Si no se pasa nombre, retornar alguna fórmula genérica | null | Hello, my friend. |
| 3. Si nos gritan, contestar con un grito | “JERRY” | HELLO, JERRY! |
| 4. Manejar dos nombres | “Jill”, “Jane” | Hello, Jill and Jane. |
| 5. Manejar cualquier número de nombras, con coma estilo Oxford | “Amy”, “Brian”, “Charlotte” | Hello, Amy, Brian, and Charlotte. |
| 6. Permitir mezclar nombres normales y gritados, pero separar las respuestas. | “Amy”, “BRIAN”, “Charlotte” | Hello, Amy and Charlotte. AND HELLO BRIAN! |
| 7. Si un nombre contiene una coma, separarlo | “Bob”, “Charlie, Dianne” | Hello, Bob, Charlie, and Dianne. |
| 8. Permitir escapar las comas de #7 | “Bob”, “"Charlie, Dianne" | Hello, Bob and Charlie, Dianne. |
Orientaciones para resolverla
Parte del interés de esta kata reside en trabajar con un requerimiento cada vez, por lo que es importante no adelantarse e ir uno por uno.
La dificultad es resolverla sin crear unidades extra, solo a través de la interfaz greet().Cada uno de los requerimientos nos permite construir un test que nos fuerce a extender el comportamiento, aunque podríamos crear cuantos tests nos parezcan necesarios.
Por otro lado, es muy importante el paso atrás del que hablábamos en la kata Bowling. Al resolver un requisito, haciendo pasar el test correspondiente, nos veremos en la necesidad de preparar el terreno para poder implementar el siguiente, manteniendo todos los tests actuales pasando.
En resumen:
- Céntrate en un requisito cada vez, en el orden propuesto.
- Una vez logrado, refactoriza para facilitar la consecución del siguiente requisito: haz que el cambio sea fácil (eso puede ser difícil) y luego haz el cambio fácil, como diría Kent Beck.
Enlaces de interés sobre la kata Greetings
- Greetings Kata1