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

Implementado SOLID – SRP

A fines de Junio asistí a un evento sobre principios de diseño SOLID, el mismo fue coordinado por Fernando Claverino y Carlos Peix y se desarrollo en las oficinas de Kleer.

A continuación vamos a intentar compartir implementaciones de estos principios, nos basaremos en los ejercicios utilizados durante el evento, focalizados en la resolución de un problema mas que en la explicación teórica del principio, sobre este último tema pueden consultar la VAN “Principios de diseño SOLID” dada por Carlos Peix.

Single responsability principle

Los pasos seguidos para aplicar este principio fueron:

  1. Probar que funcione.
  2. Identificar responsabilidades: lectura del archivo y manejo del formulario.
  3. Primera refactorización: identificar “secciones” de código y separarlas en métodos. Resultado: método AddItemToListView y ReadFile.
  4. Probar que siga funcionando.
  5. Segunda refactorización: identificar conjuntos de métodos y agruparlos en clases (aquí suelo tomar como criterio técnico los namespace que utilizan). Resultado: clase MyFileReader.
  6. Probar que siga funcionando.

Así terminamos teniendo una clase que es responsable del manejo del formulario y otra que es responsable de la lectura del archivo.

Unable to display content. Adobe Flash is required.

otras soluciones para este mismo principio:

Otros Principios:

Open / Close princpiple

Liskov substitucion principle

Interface segregation principle

Dependency inversion principle