Post on 27-Jan-2015
description
Principios SOLID de Programación Orientada a Objetos
¿Diseño Orientado a Objetos?
¿Qué es? ¿De qué trata?
¿Diseño Orientado a Objetos?
Separación de responsabilidades.Encapsulamiento.Manejo de dependencias.
¿Cómo hacemos software?
¿Qué va mal en esta historia?
¿Cómo hacemos software?
Empezamos…
¿Cómo hacemos software?
Se empieza a usar…
¿Cómo hacemos software?
Tienes que hacer cambios…
Say What?
¿Cómo hacemos software?
Luego… nuevos cambios…
¿Cómo hacemos software?
Y más…. y más cambios…
¿Cómo hacemos software?
Encuentras solución…
¿Cómo hacemos software?
Este código se está pudriendo…
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.
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.
Aquí huele raro…
¿Por qué?
Movilidad: El código no es reusable.
Viscosidad: En sus dos vertientes, diseño y entorno.
Aquí huele raro…
¿ok… pero… cómo sucede?
Aquí huele raro…
¡El código crece!
Aquí huele raro…
Y si no se mantiene adecuadamente…
Aquí huele raro…
Se hecha a perder…
Aquí huele raro…
Aquí huele raro…
Aquí huele raro…
Aquí huele raro…
Comparación
¿Cuáles son las diferencias?Primer ejemplo
Las políticas de alto nivel dependen directamente de las de bajo nivel.
Segundo ejemploLas políticas de alto y bajo nivel dependen de abstracciones.
SOLID
¿Qué es eso?
SOLID
¿Qué es eso?
Single Responsibility PrincipleOpen Closed PrincipleLiskov Substitution PrincipleInterface Segregation PrincipleDependency Inversion Principle
Single Responsibility Principle
¿Qué hace este código?
Single Responsibility Principle
Single Responsibility Principle
“Una clase debería tener una, y solo una razón para cambiar”
Robert C. MartinPrinciples of Object Oriented Design
Single Responsibility Principle
Single Responsibility Principle
Single Responsibility Principle
¿Que hay del encapsulamiento?
¿No debería de saber como se salva a si mismo?
¿?
SOLID
¿Qué es eso?
Single Responsibility PrincipleOpen Closed PrincipleLiskov Substitution PrincipleInterface Segregation PrincipleDependency Inversion Principle
Open-Closed Principle
“Todo módulo debe estar abierto para la extensión pero, cerrado para
modificación”
Bertrand MeyerObject Oriented Software Construction
Open-Closed Principle
¿Qué quiere decir esto?
Afectar el comportamiento, sin modificar.
Open-Closed Principle
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?
Open-Closed Principle
Cerrado para modificación:No se puede modificar el código de lo que hay.
Open-Closed Principle
Open-Closed Principle
¿Qué podemos hacer para resolverlo?
Abstracción.
Open-Closed Principle
Open-Closed Principle
Ejemplo Shapes 01
Open-Closed Principle
Ejemplo Shapes 02
Open-Closed Principle
¿Es posible cerrar una clase al 100%?
Open-Closed Principle
¿Cómo resolver el problema si queremos pintar los círculos antes que los
rectángulos?
Open-Closed Principle
¿Y si el orden no depende del tipo de la figura?
Open-Closed Principle
¿Consejos para evitar romper este principio?
Heurísticas para hacer esto posible:Hacer las variables miembro
privadas.
Open-Closed Principle
Open-Closed Principle
¿Consejos para evitar romper este principio?
Heurísticas para hacer esto posible:Hacer las variables miembro
privadas.No tener variables globales.
Nunca.
Open-Closed Principle
Open-Closed Principle
¿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.
Open-Closed Principle
SOLID
Herramientas bases para lograr mantenibilidad:
Abstracción.Herencia.Polimorfismo.
SOLID
Pero… ¿Qué reglas siguen?¿Qué características tienen en
común?¿Qué problemas nos podemos
encontrar?
SOLID
¿Qué es eso?
Single Responsibility PrincipleOpen Closed PrincipleLiskov Substitution PrincipleInterface Segregation PrincipleDependency Inversion Principle
Liskov Substitution Principle
“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. LiskovKeynote – Data abstraction and hierarchy (1987)
Liskov Substitution Principle
Liskov Substitution Principle
Traduciendo…
“Las funciones que usan punteros o referencias a clases base, deben ser capaces de usar objetos de clases
derivadas sin saberlo”
Liskov Substitution Principle
Liskov Substitution Principle
[Otro ejemplo sutil de violación del LSP][código LSP]
Liskov Substitution Principle
[El problema real LSP][código LSP]
Liskov Substitution Principle
¿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.
Liskov Substitution Principle
¿Qué fue mal?
Para que el “Open Closed Principle” se mantenga todas las clases derivadas deben adherirse al comportamiento que el cliente espera.
Liskov Substitution Principle
Design by contract ™(diseño por contrato)
PrecondicionesPost condicionesInvariantes
Liskov Substitution Principle
Design by contract
Derivando, solo se puede remplazar:Precondición: por una más débil.Post condición: por una más
fuerte.
Liskov Substitution Principle
Liskov Substitution Principle
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
seanPersistentObject
Liskov Substitution Principle
Liskov Substitution Principle
Solución problemática:Conoce el tipo.Falla con una excepción en tiempo de ejecución.
Liskov Substitution Principle
Liskov Substitution Principle
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.
Liskov Substitution Principle
Liskov Substitution Principle
Solución usando LSP:TransparenteMenos restrictivaInherente a la estructura del
código
Liskov Substitution Principle
LSP es parte fundamental del Open Closed Principle.
SOLID
¿Qué es eso?
Single Responsibility PrincipleOpen Closed PrincipleLiskov Substitution PrincipleInterface Segregation PrincipleDependency Inversion Principle
Dependency Inversion Principle
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.”
Dependency Inversion Principle
¿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.
Dependency Inversion Principle
Dependency Inversion Principle
¡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.
Dependency Inversion Principle
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 BoochObject Solution (1996)
Dependency Inversion Principle
Interpretación (?)
Dependency Inversion Principle
AnálisisImplicaciones de estas dependencias directas:
¡Las dependencias son transitivas!Cambios en las capas inferiores
son susceptibles a propagarse.Es difícil reutilizar las capas
superiores.
Dependency Inversion Principle
Interpretación
Dependency Inversion Principle
AnálisisImplicaciones de estas dependencias indirectas:
Desacoplo.Aislamiento.Reusabilidad.Estabilidad.
Dependency Inversion Principle
Dependency Inversion Principle
Dependency Inversion Principle
Dependency Inversion Principle
Dependency Inversion Principle
Indispensable para implementación de frameworks.Resistente al cambioAbstracción y detalle están aislados uno del otro, por lo que aumenta la mantenibilidad.
SOLID
¿Qué es eso?
Single Responsibility PrincipleOpen Closed PrincipleLiskov Substitution PrincipleInterface Segregation PrincipleDependency Inversion Principle
Interface Segregation Principle
Sabemos cómo manejar la complejidad del código. Pero…
A medida que el código crece…
Interface Segregation Principle
Las interfaces también crecen…
Interface Segregation Principle
Fat interfaces(Interfaces gordas)
Les falta cohesión.Pueden separarse en grupos donde cada grupo sirve a un conjunto diferente de clientes.
Interface Segregation Principle
Interface Segregation Principle
Fat interfaces(Interfaces gordas)
Estas interfaces se necesitan.Pero… !No todas en una sola clase!
Interface Segregation Principle
Fat interfaces(Interfaces gordas)
¿De donde salen?
Interface Segregation Principle
Interface Segregation Principle
Interface Segregation Principle
Clientes separados implican interfaces separadas.
Interface Segregation Principle
¿Por qué?
Los clientes ejercen fuerzas sobre las interfaces que emplean.
Interface Segregation Principle
¿Cuáles son?
Interface Segregation Principle
Interface Segregation Principle
Interface Segregation Principle
Implicaciones de estos cambios.
Interface Segregation Principle
“Los clientes no deben de ser forzados a depender de interfaces que no
utilizan.”
Robert C. Martin
Interface Segregation Principle
¿Qué hacemos entonces?
Interface Segregation Principle
Interface Segregation Principle
SOLID
Por último…
Son principios, no leyes. Hay que conocerlos y entenderlos para saber utilizarlos apropiadamente.
Todos deberíamos de aplicarlos.
SOLID
Por último…
Es la única forma de disminuir el número de programadores que cometen suicidio.
SOLID
¿Donde aprender más?
www.objectmentor.comwww.google.com
Patterns and Advanced Principles of OOD (R.Martin)Object Oriented Software Construction
(B. Meyer)Object Oriented Analysis and Design
(G. Booch)