Gilded Rose

Resumen

En el desarrollo de software, escribir código nuevo suele llevar poco tiempo. Por el contrario, añadir funciones al código existente, ya sea propio o ajeno, suele exigir más tiempo y esfuerzo. 

Esto significa que una habilidad muy valiosa es la capacidad de entrar en un área de código desconocida y llegar rápidamente a un estado en el que puedas entenderla, trabajar con ella y ampliarla.

Esta es una kata de refactorización. El punto de partida es un código que funciona pero que no se ha testeado, un nuevo requisito de funcionalidad y algunas restricciones. Tu trabajo consiste en implementar la nueva funcionalidad de la forma más limpia posible sin romper el código existente. Nuestro enfoque preferido para hacerlo es cubrir las áreas relevantes de la lógica con tests (de lo contrario, no sabes lo que estás rompiendo), refactorizar el código para que pueda aceptar la nueva funcionalidad, y luego añadirla de una manera test-driven.

Como restricción adicional, pregúntate: ¿cómo puedo refactorizar lo menos posible sin dejar de implementar la nueva función de forma segura y fiable? En el mundo real, esto se traduciría en una reducción de costes, así que puede ser un ejercicio útil. (En una codebase grande podrías pasar meses refactorizando, pero si no aporta ningún valor presente o futuro, puede que no valga la pena hacerlo).

Instrucciones

Las instrucciones del repositorio original son las siguientes:

Hola y bienvenidos al equipo Gilded Rose. Como sabéis, somos una pequeña posada con una excelente ubicación en una ciudad prominente gestionada por una amable posadera llamada Allison. También compramos y vendemos productos de alta calidad. Desafortunadamente, la calidad de nuestros productos se ha ido degradando a medida que se acercan a su fecha de caducidad. Tenemos un sistema que actualiza nuestro inventario por nosotros. Fue desarrollado por un tipo sensato llamado Leeroy, que ha seguido adelante con nuevas aventuras. Tu tarea consiste en añadir la nueva función a nuestro sistema para que podamos empezar a vender una nueva categoría de artículos. Primero una introducción a nuestro sistema:

  • Todos los artículos tienen un valor SellIn que indica el número de días que tenemos para vender el artículo.
  • Todos los objetos tienen un valor de calidad que indica el valor del artículo.
  • Al final de cada día nuestro sistema reduce ambos valores de cada artículo.

Bastante sencillo, ¿no? Pues aquí es donde la cosa se pone interesante:

  • Una vez pasada la fecha de caducidad, la calidad se degrada el doble de rápido.
  • La calidad de un artículo nunca es negativa.
  • El "brie añejado" aumenta su calidad a medida que envejece.
  • La calidad de un artículo nunca es superior a 50.
  • "Sulfuras", al ser un objeto legendario, nunca tiene que venderse y su calidad nunca disminuye.
  • Los "Backstage passes", como el brie curado, aumentan su calidad a medida que se acerca su valor SellIn. La calidad aumenta en 2 cuando quedan 10 días o menos y en 3 cuando quedan 5 días o menos, pero la calidad baja a 0 después del concierto.

Recientemente hemos fichado a un proveedor de artículos conjurados. Esto requiere una actualización de nuestro sistema:

  • La calidad de los objetos "conjurados" se degrada el doble de rápido que la de los objetos normales.

Siéntete libre de hacer cualquier cambio en el método UpdateQuality y de añadir cualquier código nuevo, siempre y cuando todo siga funcionando correctamente. Sin embargo, no modifiques la clase Item ni la propiedad Items, ya que pertenecen al duende de la esquina que se enfurecerá y te disparará un tiro, ya que no cree en la propiedad compartida del código (puedes hacer que el método UpdateQuality y la propiedad Items sean estáticos si quieres, nosotros te respaldaremos).

Sólo como aclaración, un objeto nunca puede tener su calidad por encima de 50, sin embargo "Sulfuras" es un objeto legendario y como tal su calidad es 80 y nunca debe cambiar.

Para empezar, clona el código. El repositorio original de esta Kata (en C#) se encuentra en el GitHub de NotMyself. Para los programadores que utilicen otros lenguajes, Emily Bache tiene un repositorio con el código de partida en muchos lenguajes de programación diferentes. El README de este último repositorio también contiene una útil explicación de las pruebas Golden Master.

Libros

Artículos

Soluciones

  • C# por Nick White y Scott Edwards (ten en cuenta que esta solución no sigue la restricción "evita modificar la clase Item Item")
  • Java por Sandro Mancuso

Vídeos