b - Principio Abierto / cerrado
c - Principio de Sustitución
d - Principio Inversión de dependencia
e - Segregación de interfaz
- Cambio mi motor de base de datos, de XXSql paso a NNSql.
Debo cambiar mi clase Cliente. - Cambio la forma de crear la salida HTML
Debo cambiar mi clase Cliente. - Agrego un reporte o modifico uno existente
Debo cambiar mi clase Cliente. - Cambio la política para calcular la presencia en el mercado
Debo cambiar mi clase Cliente.
Si vemos un poco mas allá de nuestras narices notaremos que además esto implicará cambios en aquellos artefactos que recurren a la clase Cliente para resolver alguna colaboración.
Bueno el problema es que nuestra clase Cliente tiene muchas responsabilidades, incluso algunas que exceden claramente sus responsabilidades naturales, me refiero a las responsabilidades de Cliente en su contexto de negocio.Posiblemente esa falta de cohesión nos lleve a otro problema, para mi es una regla que se cumple con rigor matemático, acoplamiento.
Que sucede entonces con aquellos metodos que ya no existen en Cliente?, bueno será nuestro trabajo buscar quienes tienen la responsabilidad de resolver esas cuestiones. Lo importante aquí es que Cliente atienda sus responsabilidades directas, aquellas en las que es experto.b - Abierto / cerrado
Una posible solución para lo relacionado con la persistencia podría ser la siguiente:

Propongamos un cambio en el requerimiento y veamos.
Problema planteado, que nos dice el principio Abierto/Cerrado?
La aplicación del principio a nuestro problema podría ser agregar una interface o una clase abstracta que sea bien conocida por Ventas, ClienteDB debería implementar la interface o heredar de la clase abstracta.

En el diagrama se puede apreciar la implementación para una cuestión más terrenal, mockobjects y test unitarios.
c - Sustitución
Vamos a aprovechar la capacidad de extensión que nos brindan los lenguajes OO, estamos frente a nuestra clase Cliente, con algunos cambios ya que los requerimientos del sistema han cambiado con el transcurso del tiempo y ahora un nuevo requerimiento nos exige considerar Clientes presenciales y Clientes virtuales.Hacemos OOP, Object Oriented Poragramming, contamos con los beneficios de la herencia, heredemos de Cliente.
La funcionalidad nueva esta relacionada con la obtención de la autorización de una transacción comercial.
El experto en autorización requiere que el cliente se identifique, pero el ClienteVirtual implementa el metodo Identificarse() disparando una Exception. Su lógica de negocio no provee un mecanismo de identificación.
El método Obtener entonces deberá tener un tratamiento especial para ClienteVirtual.Posiblemente el programador haga algo así:
if( typeof... )
//Tratamiento para ClienteVirtual
else
//Tratamiento para Cliente
El problema entonces es que CentroAutorización ya no puede tratar a ClienteVirtual como Cliente, debe conocer las características de la sub clase porque esta altera el comportamiento de la clase Cliente. ( Comportamiento, no implementación de comportamiento).
La solución en este caso es revisar eol diseño, posiblemente ClienteVirtual no este en la línea de herencia de Cliente, tal como pensamos en principio.
No atender estas cuestiones hace que nuestro diseño sea críptico, que los programadores no puedan confiar en la extensión de las clases y deban conocer el comportamiento de de cada una de ellas.
Bueno, para evitar esto debemos respetar el principio de sustitución. El mismo expresa:
La aplicación de este principio garantiza de alguna manera el éxito en la aplicación de los principios de Responsabilidad única y Abierto / cerrado.
En los próximos días completaré esta entrega con los principios restantes.
Espero que pese a lo básico este post les resulte de interés.
