El fin de semana pasado, gracias a una recomendación de un compañero, me apunté en una página de katas que está bastante guay la verdad, se llama codewars.
Básicamente, consiste en elegir la kata que más te guste, ya sea por dificultad (rango) o por lenguaje de programación (Java, C#, Haskell, Clojure, Python, Javascript…). Una vez la seleccionas, le das a intentar y te aparecen 3 ventanas: la ventana de output, la del código y la de los tests (en mi caso como era Java, eran tests en JUnit). Por último, al resolverla puedes ver las soluciones de otros usuarios y votar su solución como “buenas prácticas”, “inteligente” o dejarles un feedback.
Bueno, pues la kata que me puse a resolver se llamaba _”_Everyone has his little secrets”, o también conocida como “Little Secret Kata”. Una vez seleccionada me salió esto como descripción de la kata:
Hello, I’m a little class and I have a secret. Will you find it?
A primera vista no te ayudaba mucho y te incitaba la curiosidad por resolverla, por lo que caí en la tentación y le di a “intentar mi solución”. Y me encontré con esto…
Una vez visto el código, seguía con dudas, por lo que dije, bueno vamos a ver los tests para entenderla mejor, pero para mi sorpresa ¡no había ninguno!. Así que fue el momento de pararme a pensar, mirar el código otra vez y empezar a afilar el hacha
Primero, le di a ejecutar los “tests” a ver si pasaba algo y la ventana de output se llenó de letras en rojo. Esto me dio pistas como por ejemplo el nombre de mi clase de test GuesserTest (no muy complicado de deducir tampoco…) y que la clase LittleSecret intentaba acceder a un campo booleano estático de mi clase GuesserTest llamado guessed. Por lo que voilá, ya tengo mi clase de test:
Claramente todavía me faltaba resolverla… pero por más que me comía la cabeza y buscaba en google no lo conseguí…
Como me quedé con la intriga, busqué soluciones de la kata. Y me quedé con el siguiente código:
Al verlo, rápidamente lo entendí ya que la solución era por **_reflection, concepto que conocía en su forma teórica pero nunca lo había puesto en práctica. De forma breve, reflection _**es la capacidad que tiene un programa para examinarse a sí misma en tiempo de ejecución.
Bueno, volviendo a la kata en cuestión y después de esta breve definición, la solución consistía en cambiar la accesibilidad del campo estático secret de la clase LittleClass de private a public para poder acceder a él.
Una vez entendido, hice mi versión refactorizando el código un poco y dejándolo más limpio, por lo que mi solución final fue:
El parámetro del field.get() es null ya que según el Javadoc dice:
If the underlying field is a static field, the object argument is ignored; It may be null.
Más tarde, encontré el repositorio del usuario que creó la kata y pude ver el código de la clase LittleClass.
A modo de conclusión o retrospectiva quiero destacar que, aunque estuviese un poco desanimado por no resolverla yo mismo, estoy contento de haberme encontrado con esta kata ya que aprendí cosas nuevas y muy interesantes. Y además, me anima a seguir realizando más katas para seguir aprendiendo y mejorando como desarrollador.