NICOLÁS BOTTARINI
Gilded Rose

Gilded Rose

Una kata famosa para arrancar tu camino en refactoring

Nivel:Básico
Duración:Media
Temas:
TDDClean CodeOOPDiseñoSOLIDRefactoring

Hola y bienvenido al equipo de Gilded Rose. Como sabés, somos una posada chica con una ubicación privilegiada en una ciudad importante, atendida por una posadera muy amable llamada Allison. También compramos y vendemos solo los mejores productos. Lamentablemente, la Quality de nuestros productos se degrada constantemente a medida que se acerca su fecha límite de venta.

Tenemos un sistema que nos actualiza el inventario. Lo desarrolló un tipo bastante directo llamado Leeroy, que ya se fue a vivir nuevas aventuras. Tu tarea es agregarle la nueva funcionalidad a nuestro sistema para que podamos empezar a vender una nueva categoría de items. Primero, una introducción a nuestro sistema:

  • Todos los items tienen un valor SellIn que indica la cantidad de días que tenemos para vender los items
  • Todos los items tienen un valor Quality que indica cuánto vale el item
  • Al final de cada día, nuestro sistema baja los dos valores de cada item

Bastante simple, ¿no? Bueno, acá es donde se pone interesante:

  • Una vez que pasó la fecha límite de venta, la Quality se degrada el doble de rápido
  • La Quality de un item nunca es negativa
  • El "Aged Brie" en realidad aumenta su Quality a medida que envejece
  • La Quality de un item nunca es mayor a 50
  • "Sulfuras", al ser un item legendario, nunca se tiene que vender ni baja su Quality
  • Los "Backstage passes", como el aged brie, aumentan su Quality a medida que se acerca su valor SellIn;
    • La Quality aumenta 2 cuando faltan 10 días o menos y 3 cuando faltan 5 días o menos, pero
    • La Quality cae a 0 después del concierto

Hace poco firmamos con un proveedor de items conjurados. Esto requiere una actualización de nuestro sistema:

  • Los items "Conjured" degradan su Quality el doble de rápido que los items normales

Podés hacer todos los cambios que quieras en el método UpdateQuality y agregar todo el código nuevo que necesites, siempre y cuando todo siga funcionando bien. Eso sí, no toques la clase Item ni la propiedad Items: son del goblin del rincón, que se va a enfurecer al instante y te va a liquidar de un golpe porque no cree en el ownership compartido del código (si querés, podés hacer estáticos el método UpdateQuality y la propiedad Items, nosotros te cubrimos).

Para que quede claro: la Quality de un item nunca puede pasar de 50, pero "Sulfuras" es un item legendario y, como tal, su Quality es 80 y nunca cambia.

Instrucciones

  • Bajate una versión del código para refactorizar en el lenguaje que elijas.
  • Agregá los tests necesarios para asegurarte de no romper el código mientras refactorizás.
  • Mejorá el diseño haciendo refactoring (sin alterar el comportamiento del código).
  • Cuando estés conforme con el diseño, agregá el nuevo requisito (los items "Conjured").

Código para refactorizar

Recursos

Créditos