Principios de diseño de código orientado a objetos SOLID

46
Principios de diseño de código LUIS ALEXANDER ALDAZABAL GIL HTTP://CODE2READ.COM @BERCZECK

Transcript of Principios de diseño de código orientado a objetos SOLID

Page 1: Principios de diseño de código orientado a objetos SOLID

Principios de diseño de código

LUIS ALEXANDER ALDAZABAL GILHT TP://CODE2READ.COM@BERCZECK

Page 2: Principios de diseño de código orientado a objetos SOLID

Contenido• Introducción

• ¿Qué es la programación orientada a objetos?

• POO VS Programación estructurada

• ¿Qué son los Design Smells?

• Principios de diseño orientados a objetos

Page 3: Principios de diseño de código orientado a objetos SOLID

¿Cómo medimos la calidad?

Page 4: Principios de diseño de código orientado a objetos SOLID

¿Cuántos fideos hay en la imagen?

Ahora, ¿ Cuántos tipos de fideos hay?

Page 5: Principios de diseño de código orientado a objetos SOLID

De esta forma ¿Es más fácil saber la respuesta?

Page 6: Principios de diseño de código orientado a objetos SOLID

Entonces, ¿Vale la pena refactorizar código?

Page 7: Principios de diseño de código orientado a objetos SOLID

Si nunca tenemos tiempo, ¿Cuándo vamos a escribir código con calidad?

Page 8: Principios de diseño de código orientado a objetos SOLID

Momento de reflexión

• Cuantas veces te has topado con clases o métodos que contiene cientos o miles de líneas de código.

• Cuantas veces dentro de una clase o método encuentras todo tipo de funcionalidad: Log, Manejo errores, Sesión, etc.

• Cuantas veces has encontrado muchas sentencias if o switch dentro de un método.

• Cuanto código repetido y mal escrito hay en toda tu aplicación.

• Cuantas veces ni nosotros mismos entendemos el código que hemos escrito.

• Cuantas veces hacer un cambio toma más de lo necesario por la forma en como hemos diseñado el código.

Page 9: Principios de diseño de código orientado a objetos SOLID

¿Qué es la programación orientada a objetos?• Es un estilo de programación.

• Formada por 4 pilares:• Encapsulación: Oculta detalles de la implementación• Herencia: Crear nuevos objetos para compartir comportamientos.• Polimorfismo: Tener métodos con el mismo nombre pero con comportamientos diferentes.• Abstracción: Aislar un elemento del mundo real.

• Se crean objetos con responsabilidades únicas que contienen campos, atributos y métodos.

• Siempre considerando estas dos medidas al momento del diseño:• Acoplamiento, se busca tener un bajo acoplamiento.• Cohesión, se busca tener una alta cohesión.

Page 10: Principios de diseño de código orientado a objetos SOLID

POO VS Programación estructurada• Colaboración entre objetos.

• La funcionalidad se agrupa a nivel de objetos.

• Los objetos se pueden reutilizar.

• Diseño complejo.

• Aumenta la cohesión y disminuye el acoplamiento.

• Los objetos tiene responsabilidades únicas.

• .Net, Java, Ruby, etc

• Una serie de funciones, subrutinas y tareas.

• La funcionalidad se agrupa a nivel de tarea.

• Las funciones, subrutinas y tareas se pueden reutilizar.

• No necesita diseño.

• Disminuye la cohesión y aumenta el acoplamiento.

• SQL, VB6

Page 11: Principios de diseño de código orientado a objetos SOLID

POO VS Programación estructurada

Page 12: Principios de diseño de código orientado a objetos SOLID

¿Qué son los Design Smells?

• Síntomas que indican que estamos violando algún principio de diseño orientado a objetos.

• Esto ocurre en el diseño de la aplicación.

• Degrada la calidad del código que escribimos.

• Por lo tanto se genera código difícil de entender, esto impacta en el esfuerzo al momento de darle mantenimiento.

Page 13: Principios de diseño de código orientado a objetos SOLID

Tipos de Design Smells• Rigidez

• Fragilidad

• Inmovilidad

• Viscosidad

• Complejidad innecesaria

• Repetición innecesaria

• Opacidad

Page 14: Principios de diseño de código orientado a objetos SOLID

Tipos de Design Smells• Rigidez: • Hacer un cambio es difícil, aunque sea un cambio simple.• Un cambio causa una cascada de cambios en los módulos

dependientes.• A más módulos se tengan que cambiar, más rígido es el sistema.• Esto impacta en las estimaciones, ya que hay que hacer

cambios en módulos que no se tomaron en cuenta y toma más tiempo que el estimado.

Page 15: Principios de diseño de código orientado a objetos SOLID

Tipos de Design Smells• Fragilidad: • Un cambio causa que el código no compile, ya que

aparecieron errores en muchos lugares.• Ocurre cuando un cambio hecho en un modulo X afecta a un

modulo Y, aunque no tengan una relación directa.• A medida que el diseño es frágil la probabilidad que un

cambio introduzca nuevos problemas también aumenta.

Page 16: Principios de diseño de código orientado a objetos SOLID

Tipos de Design Smells• Inmovilidad:

• Es difícil reutilizar partes del sistema.• Ocurre cuando un diseño contiene partes que pueden ser

reutilizados por otros, pero el esfuerzo de separarlas es muy grande.

• A medida que el diseño es inmóvil la probabilidad de cometer los mismos errores también aumenta.

Page 17: Principios de diseño de código orientado a objetos SOLID

Tipos de Design Smells• Viscosidad:

• Es difícil hacer lo correcto a nivel de software o ambiente de desarrollo.

• Seguir la estrategia propuesta VS soluciones alternas.

• Ocurre cuando es mas fácil hacer las cosas mal (soluciones alternas) a hacer las cosas bien (estrategia propuesta).

Page 18: Principios de diseño de código orientado a objetos SOLID

Tipos de Design Smells• Complejidad Innecesaria:

• Son elementos que existen en el diseño que soportan requerimientos que no se necesitar.

• Ocurre cuando se quiere desarrollar una librería de propósito general y se agregan cosas que tal vez nunca se van a necesitar.

• A medida que la complejidad aumenta el código se vuelve más difícil de mantener.

Page 19: Principios de diseño de código orientado a objetos SOLID

Tipos de Design Smells• Repetición Innecesaria:

• Hacer Ctrl+V y Ctrl+C a través de todo el sistema.• Ocurre cuando se repite el mismo bug en todo el

sistema y para corregirlo hay que buscar en todos lados.• A medida que se va repitiendo código un módulo se vuelve

más difícil de mantener.

Page 20: Principios de diseño de código orientado a objetos SOLID

Tipos de Design Smells• Opacidad:

• La tendencia del código a que sea difícil de entender.• Ocurre cuando el código aumenta con el tiempo y se

vuelve mas difícil de mantener.• A medida que la opacidad aumenta se vuelve mas

complicado agregar nuevas funcionalidades.

Page 21: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• DRY: • Dont repeat yourself

• KISS: • Keep it simple stupid

• Yagni: • You are going to need it

Page 22: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID: • Conjunto de principios, no son reglas, aplicados al diseño orientado

a objetos.• No es un framework, ni una tecnología, tampoco una librería y

mucho menos una metodología.• Su propósito es generar código fácil de entender y mantener.• Representa cinco principios básicos de la programación orientada a

objetos y el diseño.

Page 23: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID: • Single Responsability

• Open Closed

• Liskov Substitution

• Interface segregation

• Dependency inversion

Page 24: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID - Single Responsability• Cada clase debe tener una única

responsabilidad.• Una clase debe tener una, y solo una,

razón de cambio, también aplica a nivel de métodos de una clase.

Page 25: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID - Single Responsability

¿Sobre qué artefactos aplica este principio?• Métodos

• Clases

• Paquetes

• Módulos

• Sistemas

Page 26: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID - Single Responsability

¿Cuándo debemos aplicar este principio?• Cuando una clase es muy larga (sugerencia si tiene más de 300 lineas de código).

• Cuando un método es muy largo (sugerencia si tiene más de 40 lineas de código).

• Cuando existen muchas dependencias a otros objetos (sugerencia si tiene más de 20 dependencias)

• Cuando hay baja cohesión.

• Cuando se usan nombres muy genéricos: Util, Manager, Process.

• Cuando se hace uso del anti patrón Spagethi Code.

Page 27: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID - Single Responsability

Argumentos en contra de este principio• Demasiadas clases

• Complicado entender el panorama general del diseño

• Nota: Tener más clases no significa necesariamente que el código sea más complicado, hay casos y casos.

Nota: Tener más clases no significa necesariamente que el código sea más complicado, hay casos y casos.

Page 28: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID – Open Closed• Una clase debe ser abierta para

extender, pero cerrada para modificar.

• Uno debe ser capaz de extender el comportamiento de una clase, sin modificar su contenido.

Page 29: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos• SOLID – Open Closed¿Sobre qué artefactos aplica este principio?• Funciones

• Clases

• Módulos

¿Qué beneficios trae el trabajar con este principio?• Reduce el riesgo de agregar nuevos bugs al código existente.

• Bajo acoplamiento.

• Flexibilidad.

• Mantenimiento, sistemas fáciles de cambiar y evolucionar.

Page 30: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos• SOLID – Open Closed¿Cuándo debemos aplicar este principio?• Cuando se detecta que una clase será sujeta a cambio

• Cuando no se puede cambiar una librería de terceros

¿Cuándo no debemos aplicar este principio?• Cuando el número de sentencias if o switch en un método no va a

cambiar

• Cuando se sabe que una clase cuenta con un comportamiento fijo.

Page 31: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos• SOLID – Open Closed¿Qué patrón puedo usar para aplicar este principio?• Strategy

• Template Method

Argumentos en contra de este principio• Requiere más esfuerzo el diseñar las clases

• Requiere mayor experiencia

Page 32: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID – Liskov substitution• Una clase derivada puede ser

reemplazada por cualquier otra que use su clase base sin alterar su correcto funcionamiento.

• Substituye una clase por otra.• Polimorfismo.

Page 33: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID – Liskov substitution¿Sobre qué artefactos aplica este principio?• Clases

¿Qué beneficios trae el trabajar con este principio?• Flexibilidad.

• Mantenimiento, sistemas fáciles de cambiar.

Page 34: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos• SOLID – Liskov substitution¿Cuándo debemos aplicar este principio?• Cuando se quiere extender el funcionamiento usando clases

derivadas sin tocar el código base.

• Cuando existan clases que compartan el mismo comportamiento.

• Cuando aplicamos el principio Open Closed.

¿Cuándo no debemos aplicar este principio?• Cuando se sabe que una clase cuenta con un comportamiento

fijo.

Page 35: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID – Interface Segregation• Define interfaces pequeñas que

resuelvan un problema específico (Role Interface) en lugar de tener interfaces grandes que hagan muchas cosas (Head Interface).

• Un cliente no debe ser forzado a implementar interfaces que no necesite.

Page 36: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos• SOLID – Interface Segregation¿Sobre qué artefactos aplica este principio?• Clases

• Interfaces

¿Qué beneficios trae el trabajar con este principio?• Bajo acoplamiento.

• Alta cohesión.

• Código fácil de cambiar.

• Código fácil de mantener.

• Código fácil de desplegar.

Page 37: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos• SOLID – Interface Segregation¿Cuándo debemos aplicar este principio?• Cuando existan clases con métodos vacíos o que devuelvan valores por defecto.

• Cuando existan clases con métodos que devuelvan excepciones del tipo NotImplementedException.

• Cuando un cliente usa solo algunos métodos de una clase.

¿Cuándo no debemos aplicar este principio?• Cuando una clase no va a ser rehusada (Una clase controladora o un servicio web)

• Cuando nadie depende de esta clase.

Page 38: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos• SOLID – Interface Segregation

Page 39: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos• SOLID – Interface Segregation

Page 40: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID – Dependency inversión• Los módulos de alto nivel no deben

depender de los módulos de bajo nivel ambos deben depender de abstracciones (Interfaces, Clases abstractas), no de clases concretas.

• Las abstracciones no deben depender de los detalles, los detalles deben depender de las abstracciones.

Page 41: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID – Dependency inversión¿Sobre qué artefactos aplica este principio?• Clases

• Paquetes

• Módulos

¿Qué beneficios trae el trabajar con este principio?• Bajo acoplamiento.

• Testeabilidad.

• Flexibilidad.

Page 42: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos• SOLID – Dependency inversión¿Cuándo se recomienda aplicar este principio?• Cuando se necesitan desacoplar piezas de software que pueden cambiar en el

futuro.

• Cuando el nivel de acoplamiento en el código es alto.

¿Cuándo no debemos aplicar este principio?• Cuando se desarrolla un módulo CRUD pequeño .

Argumentos en contra de este principio• Requiere mayor experiencia

• Requiere más esfuerzo el diseñar los artefactos

• Demasiadas interfaces

• Complicado entender el panorama general del diseño

Page 43: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID – Dependency inversión• Los módulos de alto nivel no deben depender de los de

bajo nivel.

Page 44: Principios de diseño de código orientado a objetos SOLID

Principios de diseño orientados a objetos

• SOLID – Dependency inversión• Abstracciones no deben depender de los detalles, los

detalles deben depender de las abstracciones

Page 45: Principios de diseño de código orientado a objetos SOLID

Recursos• c# Principios SOLID – Caso práctico: Módulo de seguridad Parte 1

• c# Principios SOLID – Caso práctico: Módulo de seguridad Parte 2

• c# Object oriented design – ¿Qué significa SOLID?

• c# Object oriented design – ¿Cómo aplicas el principio Single Responsability?

• c# Object oriented design – ¿Cómo aplicas el principio Open Closed?

• c# Object oriented design – ¿Cómo aplicas el principio Liskov Substitution?

• c# Object oriented design – ¿Cómo aplicas el principio Interface Segregation?

• c# Object oriented design – Dependency Inversion ¿Cómo aplicas este principio?

Page 46: Principios de diseño de código orientado a objetos SOLID

Preguntas