Este documento explica los principios SOLID de diseño orientado a objetos. Brevemente describe cada principio: el Principio de Responsabilidad Única, el Principio Abierto/Cerrado, el Principio de Sustitución de Liskov, el Principio de Segregación de Interfaz y el Principio de Inversión de Dependencias. El objetivo de estos principios es lograr software flexible, reutilizable y mantenible.
12. Aquí huele raro… ¿Cuándo sabes que comienza a podrirse? Rezas para que no tengas que hacer cambios. Cambios “sencillos” toman semanas… Trabajar con el código es una tortura… Etc.
13. Aquí huele raro… ¿Por qué? Rigidez: Tantas interdependencias que un cambio implica cambios por todas partes. Fragilidad: El sistema se rompe fácilmente, y en lugares que no relacionados.
14. Aquí huele raro… ¿Por qué? Movilidad: El código no es reusable. Viscosidad: En sus dos vertientes, diseño y entorno.
23. Comparación ¿Cuáles son las diferencias? Primer ejemplo Las políticas de alto nivel dependen directamente de las de bajo nivel. Segundo ejemplo Las políticas de alto y bajo nivel dependen de abstracciones.
25. SOLID ¿Qué es eso? Single ResponsibilityPrinciple Open ClosedPrinciple LiskovSubstitutionPrinciple Interface SegregationPrinciple DependencyInversionPrinciple
33. SOLID ¿Qué es eso? Single ResponsibilityPrinciple Open ClosedPrinciple LiskovSubstitutionPrinciple Interface SegregationPrinciple DependencyInversionPrinciple
34.
35. Open-ClosedPrinciple “Todo módulo debe estar abierto para la extensión pero, cerrado para modificación” Bertrand Meyer ObjectOriented Software Construction
37. Open-ClosedPrinciple Abierto para extensión: ¿Cómo podemos hacerlo comportarse en nuevas y distintas formas a medida que la aplicación evoluciona, o para ajustarse a las necesidades de nuevas aplicaciones?
49. Open-ClosedPrinciple ¿Consejos para evitar romper este principio? Heurísticas para hacer esto posible: Hacer las variables miembro privadas. No tener variables globales. Nunca.
51. Open-ClosedPrinciple ¿Consejos para evitar romper este principio? Heurísticas para hacer esto posible: Hacer las variables miembro privadas. No tener variables globales. Nunca. Evitar usar RTTI.
54. SOLID Pero… ¿Qué reglas siguen? ¿Qué características tienen en común? ¿Qué problemas nos podemos encontrar?
55. SOLID ¿Qué es eso? Single ResponsibilityPrinciple Open ClosedPrinciple LiskovSubstitutionPrinciple Interface SegregationPrinciple DependencyInversionPrinciple
56.
57. LiskovSubstitutionPrinciple “Si para todo objeto o1 de tipo S existe un objeto o2 de tipo T tal que para todo programa P definido en función de T el comportamiento de P no cambia cuando o1 es substituido por o2, entonces S es un subtipo de T” Barbara J. Liskov Keynote – Data abstraction and hierarchy (1987)
63. LiskovSubstitutionPrinciple ¿Qué fue mal? El programador hizo suposiciones. Square no se comporta como Rectangle. La relación “es un” se refiere al compor-tamiento extrínseco, no intrínseco.
64. LiskovSubstitutionPrinciple ¿Qué fue mal? Para que el “Open ClosedPrinciple” se mantenga todas las clases derivadas deben adherirse al comportamiento que el cliente espera.
68. LiskovSubstitutionPrinciple El problema: Añadir PersistentSet que se puede leer y escribir de un stream, pero… Condiciones: Usar librería de tercero. Requiere que los objetos internos sean PersistentObject
72. LiskovSubstitutionPrinciple Solución que no se adhiere a LSP: Es una convención. Es fácil de violar. No funciona del todo (el nuevo). Hay que revenderla. Es restrictiva.
76. SOLID ¿Qué es eso? Single ResponsibilityPrinciple Open ClosedPrinciple LiskovSubstitutionPrinciple Interface SegregationPrinciple DependencyInversionPrinciple
77.
78. DependencyInversionPrinciple A) “Los módulos de alto nivel no deben de depender de módulos de bajo nivel. Ambos deben depender de abstracciones.” B) “Las abstracciones no deben depender de detalles. Los detalles deben depender de abstracciones.”
79. DependencyInversionPrinciple ¿Por qué “inversión”? Las formas mas tradicionales de diseño de software como el diseño y análisis estructurado, promueven la creación de estructuras donde los módulos de alto nivel dependen sobre módulos de bajo nivel.
81. DependencyInversionPrinciple ¡Es absurdo! … ¿Pero… por qué? Lo que queremos es la reutilización de los módulos de alto nivel. Los módulos de bajo nivel ya sabemos re-utilizarlos.
82. DependencyInversionPrinciple El concepto de capas (Layering) “… toda arquitectura orientado a objetos que esté bien estructurada tiene capas claramente definidas, donde cada capa ofrece una serie de servicios coherentes mediante una serie de interfaces bien controladas y definidas.” Grady Booch ObjectSolution (1996)
84. DependencyInversionPrinciple Análisis Implicaciones de estas dependencias directas: ¡Las dependencias son transitivas! Cambios en las capas inferiores son susceptibles a propagarse. Es difícil reutilizar las capas superiores.
92. SOLID ¿Qué es eso? Single ResponsibilityPrinciple Open ClosedPrinciple LiskovSubstitutionPrinciple Interface SegregationPrinciple DependencyInversionPrinciple
96. Interface SegregationPrinciple Fat interfaces (Interfaces gordas) Les falta cohesión. Pueden separarse en grupos donde cada grupo sirve a un conjunto diferente de clientes.
112. SOLID Por último… Son principios, no leyes. Hay que conocerlos y entenderlos para saber utilizarlos apropiadamente. Todos deberíamos de aplicarlos.
113. SOLID Por último… Es la única forma de disminuir el número de programadores que cometen suicidio.
114. SOLID ¿Donde aprender más? www.objectmentor.com www.google.com Patterns and AdvancedPrinciples of OOD (R.Martin) ObjectOriented Software Construction (B. Meyer) ObjectOrientedAnalysis and Design (G. Booch)