
Gilded Rose
Una kata famosa para arrancar tu camino en refactoring
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
itemstienen un valorSellInque indica la cantidad de días que tenemos para vender lositems - Todos los
itemstienen un valorQualityque 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
Qualityse degrada el doble de rápido - La
Qualityde un item nunca es negativa - El "Aged Brie" en realidad aumenta su
Qualitya medida que envejece - La
Qualityde un item nunca es mayor a50 - "Sulfuras", al ser un item legendario, nunca se tiene que vender ni baja su
Quality - Los "Backstage passes", como el aged brie, aumentan su
Qualitya medida que se acerca su valorSellIn;- La
Qualityaumenta2cuando faltan10días o menos y3cuando faltan5días o menos, pero - La
Qualitycae a0después del concierto
- La
Hace poco firmamos con un proveedor de items conjurados. Esto requiere una actualización de nuestro sistema:
- Los items "Conjured" degradan su
Qualityel 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
- GildedRose-Refactoring-Kata, de Emily Bache, en muchos lenguajes
Recursos
- Why Developers LOVE The Gilded Rose Kata
- Fun Refactoring! - Gilded Rose Kata, Hands-on with Approval Testing
- Part 1: Introducing the Gilded Rose kata and writing test cases using Approval Tests
- Part 2: Refactoring item logic using "lift up conditional"
- Part 3: Replace Conditional with Polymorphism
- Refactoring the Gilded Rose Kata