Implementando SOLID–OCP

Este es el segundo post de la serie Implementando SOLID, en esta ocasión vamos a implementar el principio Abierto (a la extensión) Cerrado (a la modificación).

Open close principle:

Los (micro)pasos seguidos para aplicar este principio se puede separar en 3 grupos de refactorización, el primer refactor tiene mucho que ver en el principio de responsabilidad única que vimos en el post anterior ya que estamos separando el criterio de filtrado de la aplicación de este criterio sobre la lista de productos. En el segundo refactor nos terminamos de preparar para aplicar el principio OCP (pasos 1 y 2) y lo aplicamos (paso 4). En el tercer refactor podemos ver como extendemos el funcionamiento sin modificar el código anterior.

Refactor 1: Separando responsabilidades de ProductoFilter.ByColor:
  1. Run tests, todo en verde, refactorizamos.
  2. En ProductFilter, extraemos el método Match a partir de la condición de filtrado.
  3. Run tests, todo en verde.
  4. Creamos la clase ColorCriteria, movemos el método Match a esta nueva clase y ajustamos el código.
  5. Run tests, todo en verde.
  6. Pasamos el productColor como parámetro en el constructor y ajustamos el código.
  7. Cambiamos el parámetro productColor del método ByColor por el criteria, cambiando de lugar la instanciación de ColorCriteria a la invocación de este método. Ajustamos el código.
  8. Run tests, todo en verde.


ver screencast

Refactor 2: generalizando ProductFilter.ByColor y ProductFilter.BySize
  1. Extraemos una interface de ColorCriteria, que llamaremos ICriteria y contendrá el método Match.
  2. Reemplazamos el type del parámetro criteria de ProductoFilter.ByColor a ICriteria y cambiamos el nombre del método a ByCriteria.
  3. Run tests, todo en verde.
  4. Creamos una nueva implementación de ICriteria para Size que llamaremos SizeCriteria, tomamos el código de ProductFilter.BySize, el cual borraremos y en su lugar invocaremos a ByCriteria. Ajustamos el código.
  5. Run tests, todo en verde.


ver screencast

Refactor 3: agregando implementación de ICriteria para filtrar por color y tamaño
  1. Creamos una nueva implementación de ICriteria llamada MultiCriteria que haga el Match contra todos los elementos de una lista de ICriteria.
  2. Borramos el método ByColorAndSize de ProductFilter y reemplazamos sus invocaciones por ByCriteria con MultiCriteria. Ajustamos el código.
  3. Run tests, todo en verde.


ver screencast

código fuente final: clic aquí

Y aquí les comparto la solución de Fernando para este mismo caso y la de Martín

No hay comentarios.:

Publicar un comentario