El código a refactorizar:
Emily Bache Gilded Rose Kata - Java
La lógica del negocio:
Cómo se actualiza la calidad de los items y su fechas de caducidad
En el capítulo 24 del libro Code Complete de Steven C. McConnell encontrarás todas las buenas prácticas que necesitas conocer para refactorizar de manera sistemática.
Martin Fowler define la técnica de refactorización como:
"a change made to the internal structure of the software to make it easier to understand and cheaper to modify without changing its observable behavior”.
Es, sin duda, la frase que aprendida de memoria más salud y felicidad reportará a tu vida.
En el caso de la refactorización de la lógica de los productos mágicos de la tienda Gilded Rose, según las directrices de Code Complete:
-
"Replace conditionals with polymorphism (especially repeated case statements):
- Much of the logic that used to be contained in case statements in structured programs can instead be baked into the inheritance hierarchy and accomplished through polymorphic routine calls instead."
-
A big refactoring is a recipe for disaster. —Kent Beck :slack_call: @Elmo
Es decir: para evitar la complejidad provocada por if-else
anidados y sus correspondientes operadores lógicos vamos a utilizar polimorfismo o el Principio de Substitución de Liskov (LSP)(es una mujer, listo) de los principios SOLID.
Además, practicaremos TDD añadiendo poco a poco casos test para evitar etapas demasiado grandes de refactorizaciones que nos aboquen a un desastre.
Cap. 1 libro Beginning Java 8 Fundamentals.
- Abstracción: exponer sólo los detalles esenciales.
- Encapsulamiento: agrupar datos + las operaciones sobre esos datos => DAT o tipo de dato abstracto (Data Abstract Type).
- Herencia: derivar un DAT de otro, por ejemplo, el xenomorpho de la película Alien (buen spoiler).
- Ocultar información: ocultar detalles de implementación que pueden cambiar.
- Polimorfismo: una entidad soporta diferentes significados en diferentes contextos.
- Coercitivo: cast de tipos.
- De inclusión: herencia y sobreescritura (de métodos)
- De sobrecarga (de métodos).
- Paramétrico: generics de Java. :mrmeeseeks: Mr. Meeseeks!
Capítulo 6: Working Classes, Code Complete: https://docs.google.com/document/d/1qFJXxEiWWgJPYbPghdB1d6O9TTbNmb3l85VWs-NNDfk
Vamos a aplicar polimorfismo o el Principio de Substitución de Liskov (LSP)(es una mujer, listo) de los principios SOLID.
L de SOLID = Principio de Substitución de Liksov
"Un tipo de dato abstracto se implementa escribiendo una clase especial de programa que define el tipo en términos de las operaciones que pueden ser realizadas sobre él". Esta es la interpretación duck typing.
"Los subtipos deben ser substituibles por sus tipos básicos". Martin C. Robert.
"Se acepta normalmente que los objetos deben ser modificados unicamente a través de sus métodos (Encapsulamiento). Como los subtipos pueden introducir nuevos métodos, ausentes en el supertipo, estos podrían cambiar el estado interno del objeto en formas que serían imposibles o inadmisibles en el supertipo. La restricción histórica impide este tipo de modificaciones."
Utiliza este diagrama de clases UML para guiarte en la implementación de las clases:
Básicamente, es el mismo diseño que entre todas las personas de clase hemos discurrido de manera colaborativa: