Principios SOLID de Diseño Orientado a Objetos

114
Principios SOLID de Programación Orientada a Objetos

description

 

Transcript of Principios SOLID de Diseño Orientado a Objetos

Page 1: Principios SOLID de Diseño Orientado a Objetos

Principios SOLID de Programación Orientada a Objetos

Page 2: Principios SOLID de Diseño Orientado a Objetos

¿Diseño Orientado a Objetos?

¿Qué es? ¿De qué trata?

Page 3: Principios SOLID de Diseño Orientado a Objetos

¿Diseño Orientado a Objetos?

Separación de responsabilidades.Encapsulamiento.Manejo de dependencias.

Page 4: Principios SOLID de Diseño Orientado a Objetos

¿Cómo hacemos software?

¿Qué va mal en esta historia?

Page 5: Principios SOLID de Diseño Orientado a Objetos

¿Cómo hacemos software?

Empezamos…

Page 6: Principios SOLID de Diseño Orientado a Objetos

¿Cómo hacemos software?

Se empieza a usar…

Page 7: Principios SOLID de Diseño Orientado a Objetos

¿Cómo hacemos software?

Tienes que hacer cambios…

Say What?

Page 8: Principios SOLID de Diseño Orientado a Objetos

¿Cómo hacemos software?

Luego… nuevos cambios…

Page 9: Principios SOLID de Diseño Orientado a Objetos

¿Cómo hacemos software?

Y más…. y más cambios…

Page 10: Principios SOLID de Diseño Orientado a Objetos

¿Cómo hacemos software?

Encuentras solución…

Page 11: Principios SOLID de Diseño Orientado a Objetos

¿Cómo hacemos software?

Este código se está pudriendo…

Page 12: Principios SOLID de Diseño Orientado a Objetos

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.

Page 13: Principios SOLID de Diseño Orientado a Objetos

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.

Page 14: Principios SOLID de Diseño Orientado a Objetos

Aquí huele raro…

¿Por qué?

Movilidad: El código no es reusable.

Viscosidad: En sus dos vertientes, diseño y entorno.

Page 15: Principios SOLID de Diseño Orientado a Objetos

Aquí huele raro…

¿ok… pero… cómo sucede?

Page 16: Principios SOLID de Diseño Orientado a Objetos

Aquí huele raro…

¡El código crece!

Page 17: Principios SOLID de Diseño Orientado a Objetos

Aquí huele raro…

Y si no se mantiene adecuadamente…

Page 18: Principios SOLID de Diseño Orientado a Objetos

Aquí huele raro…

Se hecha a perder…

Page 19: Principios SOLID de Diseño Orientado a Objetos

Aquí huele raro…

Page 20: Principios SOLID de Diseño Orientado a Objetos

Aquí huele raro…

Page 21: Principios SOLID de Diseño Orientado a Objetos

Aquí huele raro…

Page 22: Principios SOLID de Diseño Orientado a Objetos

Aquí huele raro…

Page 23: Principios SOLID de Diseño Orientado a Objetos

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.

Page 24: Principios SOLID de Diseño Orientado a Objetos

SOLID

¿Qué es eso?

Page 25: Principios SOLID de Diseño Orientado a Objetos

SOLID

¿Qué es eso?

Single Responsibility PrincipleOpen Closed PrincipleLiskov Substitution PrincipleInterface Segregation PrincipleDependency Inversion Principle

Page 26: Principios SOLID de Diseño Orientado a Objetos
Page 27: Principios SOLID de Diseño Orientado a Objetos

Single Responsibility Principle

¿Qué hace este código?

Page 28: Principios SOLID de Diseño Orientado a Objetos

Single Responsibility Principle

Page 29: Principios SOLID de Diseño Orientado a Objetos

Single Responsibility Principle

“Una clase debería tener una, y solo una razón para cambiar”

Robert C. MartinPrinciples of Object Oriented Design

Page 30: Principios SOLID de Diseño Orientado a Objetos

Single Responsibility Principle

Page 31: Principios SOLID de Diseño Orientado a Objetos

Single Responsibility Principle

Page 32: Principios SOLID de Diseño Orientado a Objetos

Single Responsibility Principle

¿Que hay del encapsulamiento?

¿No debería de saber como se salva a si mismo?

¿?

Page 33: Principios SOLID de Diseño Orientado a Objetos

SOLID

¿Qué es eso?

Single Responsibility PrincipleOpen Closed PrincipleLiskov Substitution PrincipleInterface Segregation PrincipleDependency Inversion Principle

Page 34: Principios SOLID de Diseño Orientado a Objetos
Page 35: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

“Todo módulo debe estar abierto para la extensión pero, cerrado para

modificación”

Bertrand MeyerObject Oriented Software Construction

Page 36: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

¿Qué quiere decir esto?

Afectar el comportamiento, sin modificar.

Page 37: Principios SOLID de Diseño Orientado a Objetos

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?

Page 38: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

Cerrado para modificación:No se puede modificar el código de lo que hay.

Page 39: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

Page 40: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

¿Qué podemos hacer para resolverlo?

Abstracción.

Page 41: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

Page 42: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

Ejemplo Shapes 01

Page 43: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

Ejemplo Shapes 02

Page 44: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

¿Es posible cerrar una clase al 100%?

Page 45: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

¿Cómo resolver el problema si queremos pintar los círculos antes que los

rectángulos?

Page 46: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

¿Y si el orden no depende del tipo de la figura?

Page 47: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

¿Consejos para evitar romper este principio?

Heurísticas para hacer esto posible:Hacer las variables miembro

privadas.

Page 48: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

Page 49: Principios SOLID de Diseño Orientado a Objetos

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.

Page 50: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

Page 51: Principios SOLID de Diseño Orientado a Objetos

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.

Page 52: Principios SOLID de Diseño Orientado a Objetos

Open-Closed Principle

Page 53: Principios SOLID de Diseño Orientado a Objetos

SOLID

Herramientas bases para lograr mantenibilidad:

Abstracción.Herencia.Polimorfismo.

Page 54: Principios SOLID de Diseño Orientado a Objetos

SOLID

Pero… ¿Qué reglas siguen?¿Qué características tienen en

común?¿Qué problemas nos podemos

encontrar?

Page 55: Principios SOLID de Diseño Orientado a Objetos

SOLID

¿Qué es eso?

Single Responsibility PrincipleOpen Closed PrincipleLiskov Substitution PrincipleInterface Segregation PrincipleDependency Inversion Principle

Page 56: Principios SOLID de Diseño Orientado a Objetos
Page 57: Principios SOLID de Diseño Orientado a Objetos

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)

Page 58: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

Page 59: Principios SOLID de Diseño Orientado a Objetos

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”

Page 60: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

Page 61: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

[Otro ejemplo sutil de violación del LSP][código LSP]

Page 62: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

[El problema real LSP][código LSP]

Page 63: Principios SOLID de Diseño Orientado a Objetos

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.

Page 64: Principios SOLID de Diseño Orientado a Objetos

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.

Page 65: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

Design by contract ™(diseño por contrato)

PrecondicionesPost condicionesInvariantes

Page 66: Principios SOLID de Diseño Orientado a Objetos

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.

Page 67: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

Page 68: Principios SOLID de Diseño Orientado a Objetos

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

Page 69: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

Page 70: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

Solución problemática:Conoce el tipo.Falla con una excepción en tiempo de ejecución.

Page 71: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

Page 72: Principios SOLID de Diseño Orientado a Objetos

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.

Page 73: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

Page 74: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

Solución usando LSP:TransparenteMenos restrictivaInherente a la estructura del

código

Page 75: Principios SOLID de Diseño Orientado a Objetos

Liskov Substitution Principle

LSP es parte fundamental del Open Closed Principle.

Page 76: Principios SOLID de Diseño Orientado a Objetos

SOLID

¿Qué es eso?

Single Responsibility PrincipleOpen Closed PrincipleLiskov Substitution PrincipleInterface Segregation PrincipleDependency Inversion Principle

Page 77: Principios SOLID de Diseño Orientado a Objetos
Page 78: Principios SOLID de Diseño Orientado a Objetos

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.”

Page 79: Principios SOLID de Diseño Orientado a Objetos

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.

Page 80: Principios SOLID de Diseño Orientado a Objetos

Dependency Inversion Principle

Page 81: Principios SOLID de Diseño Orientado a Objetos

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.

Page 82: Principios SOLID de Diseño Orientado a Objetos

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)

Page 83: Principios SOLID de Diseño Orientado a Objetos

Dependency Inversion Principle

Interpretación (?)

Page 84: Principios SOLID de Diseño Orientado a Objetos

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.

Page 85: Principios SOLID de Diseño Orientado a Objetos

Dependency Inversion Principle

Interpretación

Page 86: Principios SOLID de Diseño Orientado a Objetos

Dependency Inversion Principle

AnálisisImplicaciones de estas dependencias indirectas:

Desacoplo.Aislamiento.Reusabilidad.Estabilidad.

Page 87: Principios SOLID de Diseño Orientado a Objetos

Dependency Inversion Principle

Page 88: Principios SOLID de Diseño Orientado a Objetos

Dependency Inversion Principle

Page 89: Principios SOLID de Diseño Orientado a Objetos

Dependency Inversion Principle

Page 90: Principios SOLID de Diseño Orientado a Objetos

Dependency Inversion Principle

Page 91: Principios SOLID de Diseño Orientado a Objetos

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.

Page 92: Principios SOLID de Diseño Orientado a Objetos

SOLID

¿Qué es eso?

Single Responsibility PrincipleOpen Closed PrincipleLiskov Substitution PrincipleInterface Segregation PrincipleDependency Inversion Principle

Page 93: Principios SOLID de Diseño Orientado a Objetos
Page 94: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Sabemos cómo manejar la complejidad del código. Pero…

A medida que el código crece…

Page 95: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Las interfaces también crecen…

Page 96: Principios SOLID de Diseño Orientado a Objetos

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.

Page 97: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Page 98: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Fat interfaces(Interfaces gordas)

Estas interfaces se necesitan.Pero… !No todas en una sola clase!

Page 99: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Fat interfaces(Interfaces gordas)

¿De donde salen?

Page 100: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Page 101: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Page 102: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Clientes separados implican interfaces separadas.

Page 103: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

¿Por qué?

Los clientes ejercen fuerzas sobre las interfaces que emplean.

Page 104: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

¿Cuáles son?

Page 105: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Page 106: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Page 107: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Implicaciones de estos cambios.

Page 108: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

“Los clientes no deben de ser forzados a depender de interfaces que no

utilizan.”

Robert C. Martin

Page 109: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

¿Qué hacemos entonces?

Page 110: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Page 111: Principios SOLID de Diseño Orientado a Objetos

Interface Segregation Principle

Page 112: Principios SOLID de Diseño Orientado a Objetos

SOLID

Por último…

Son principios, no leyes. Hay que conocerlos y entenderlos para saber utilizarlos apropiadamente.

Todos deberíamos de aplicarlos.

Page 113: Principios SOLID de Diseño Orientado a Objetos

SOLID

Por último…

Es la única forma de disminuir el número de programadores que cometen suicidio.

Page 114: Principios SOLID de Diseño Orientado a Objetos

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)