SlideShare una empresa de Scribd logo
Principios de diseño de código
LUIS ALEXANDER ALDAZABAL GIL
HTTP://CODE2READ.COM
@BERCZECK
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
¿Cómo medimos la calidad?
¿Cuántos fideos hay
en la imagen?
Ahora, ¿ Cuántos
tipos de fideos hay?
De esta forma ¿Es más fácil saber la respuesta?
Entonces, ¿Vale la pena refactorizar código?
Si nunca tenemos tiempo,
¿Cuándo vamos a escribir
código con calidad?
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.
¿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.
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
POO VS Programación estructurada
¿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.
Tipos de Design Smells
• Rigidez
• Fragilidad
• Inmovilidad
• Viscosidad
• Complejidad innecesaria
• Repetición innecesaria
• Opacidad
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.
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.
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.
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).
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.
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.
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.
Principios de diseño orientados a objetos
• DRY:
• Dont repeat yourself
• KISS:
• Keep it simple stupid
• Yagni:
• You are going to need it
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.
Principios de diseño orientados a objetos
• SOLID:
• Single Responsability
• Open Closed
• Liskov Substitution
• Interface segregation
• Dependency inversion
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.
Principios de diseño orientados a objetos
• SOLID - Single Responsability
¿Sobre qué artefactos aplica este
principio?
• Métodos
• Clases
• Paquetes
• Módulos
• Sistemas
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
Principios de diseño orientados a objetos
• SOLID – Interface Segregation
Principios de diseño orientados a objetos
• SOLID – Interface Segregation
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.
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.
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
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.
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
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?
Preguntas

Más contenido relacionado

La actualidad más candente

DDD (Domain-Driven Design)
DDD (Domain-Driven Design)DDD (Domain-Driven Design)
DDD (Domain-Driven Design)
Senior Dev
 
Uso de herramientas case
Uso de herramientas caseUso de herramientas case
Uso de herramientas case
Memo Wars
 
problemas del software
problemas del softwareproblemas del software
problemas del software
David Abisai Gomez
 
Pseudocodigo - Algoritmos - Diagramas de flujo
Pseudocodigo - Algoritmos - Diagramas de flujoPseudocodigo - Algoritmos - Diagramas de flujo
Pseudocodigo - Algoritmos - Diagramas de flujo
Juan Guillermo Ferrer Hernandez
 
Unidad 1_Programacion Orientada a Objetos
Unidad 1_Programacion Orientada a ObjetosUnidad 1_Programacion Orientada a Objetos
Unidad 1_Programacion Orientada a Objetos
Cindy Adriana Bohórquez Santana
 
Modelos de proceso de desarrollo de software
Modelos de proceso de desarrollo de softwareModelos de proceso de desarrollo de software
Modelos de proceso de desarrollo de softwareUriel Ramos
 
Arquitectura de Software Principio Abierto- Cerrado Open/Close
Arquitectura de Software Principio Abierto- Cerrado Open/CloseArquitectura de Software Principio Abierto- Cerrado Open/Close
Arquitectura de Software Principio Abierto- Cerrado Open/Close
Ernesto Maya
 
Metodologia Incremental
Metodologia IncrementalMetodologia Incremental
Metodologia Incremental
JOHNNY SURI MAMANI
 
2012 the clean architecture by Uncle bob
2012 the clean architecture by Uncle bob 2012 the clean architecture by Uncle bob
2012 the clean architecture by Uncle bob
GEORGE LEON
 
Principios orientacion-objetos
Principios orientacion-objetosPrincipios orientacion-objetos
Principios orientacion-objetos
karlalopezbello
 
sistema gestor BD PostgreSql
sistema gestor BD PostgreSqlsistema gestor BD PostgreSql
sistema gestor BD PostgreSql
Jr. Serrano
 
Enfoque estrategico para la prueba de software
Enfoque estrategico para la prueba de softwareEnfoque estrategico para la prueba de software
Enfoque estrategico para la prueba de software
Jorge Bustillos
 
Programación Extrema (XP)
Programación Extrema (XP)Programación Extrema (XP)
Programación Extrema (XP)
Lucas Passalacqua
 
Preguntas JAVA.docx
Preguntas JAVA.docxPreguntas JAVA.docx
Preguntas JAVA.docx
CarlosNishimura1
 
Modelos y Lenguajes Para Computación Paralela
Modelos y Lenguajes Para Computación ParalelaModelos y Lenguajes Para Computación Paralela
Modelos y Lenguajes Para Computación ParalelaRicardo Montañana
 

La actualidad más candente (20)

DDD (Domain-Driven Design)
DDD (Domain-Driven Design)DDD (Domain-Driven Design)
DDD (Domain-Driven Design)
 
Uso de herramientas case
Uso de herramientas caseUso de herramientas case
Uso de herramientas case
 
Algoritmo del baquero
Algoritmo del baqueroAlgoritmo del baquero
Algoritmo del baquero
 
problemas del software
problemas del softwareproblemas del software
problemas del software
 
Ingenieria de Software
Ingenieria de SoftwareIngenieria de Software
Ingenieria de Software
 
Pseudocodigo - Algoritmos - Diagramas de flujo
Pseudocodigo - Algoritmos - Diagramas de flujoPseudocodigo - Algoritmos - Diagramas de flujo
Pseudocodigo - Algoritmos - Diagramas de flujo
 
Unidad 1_Programacion Orientada a Objetos
Unidad 1_Programacion Orientada a ObjetosUnidad 1_Programacion Orientada a Objetos
Unidad 1_Programacion Orientada a Objetos
 
Herramientas Case
Herramientas CaseHerramientas Case
Herramientas Case
 
Modelos de proceso de desarrollo de software
Modelos de proceso de desarrollo de softwareModelos de proceso de desarrollo de software
Modelos de proceso de desarrollo de software
 
Arquitectura de Software Principio Abierto- Cerrado Open/Close
Arquitectura de Software Principio Abierto- Cerrado Open/CloseArquitectura de Software Principio Abierto- Cerrado Open/Close
Arquitectura de Software Principio Abierto- Cerrado Open/Close
 
Metodologia Incremental
Metodologia IncrementalMetodologia Incremental
Metodologia Incremental
 
2012 the clean architecture by Uncle bob
2012 the clean architecture by Uncle bob 2012 the clean architecture by Uncle bob
2012 the clean architecture by Uncle bob
 
Caracteristicas Microsoft SQL Server
Caracteristicas Microsoft SQL ServerCaracteristicas Microsoft SQL Server
Caracteristicas Microsoft SQL Server
 
Principios orientacion-objetos
Principios orientacion-objetosPrincipios orientacion-objetos
Principios orientacion-objetos
 
sistema gestor BD PostgreSql
sistema gestor BD PostgreSqlsistema gestor BD PostgreSql
sistema gestor BD PostgreSql
 
Enfoque estrategico para la prueba de software
Enfoque estrategico para la prueba de softwareEnfoque estrategico para la prueba de software
Enfoque estrategico para la prueba de software
 
Programación Extrema (XP)
Programación Extrema (XP)Programación Extrema (XP)
Programación Extrema (XP)
 
Preguntas JAVA.docx
Preguntas JAVA.docxPreguntas JAVA.docx
Preguntas JAVA.docx
 
Modelo en espiral
Modelo en espiralModelo en espiral
Modelo en espiral
 
Modelos y Lenguajes Para Computación Paralela
Modelos y Lenguajes Para Computación ParalelaModelos y Lenguajes Para Computación Paralela
Modelos y Lenguajes Para Computación Paralela
 

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

Patrones de diseño
Patrones de diseñoPatrones de diseño
Patrones de diseñoaleja0940
 
U5.pptx
U5.pptxU5.pptx
U5.pptx
MayraTrejo23
 
Deconstrucción de SOLID
Deconstrucción de SOLIDDeconstrucción de SOLID
Deconstrucción de SOLID
Fernando Escolar Martínez-Berganza
 
Day01
Day01Day01
Day01
peterpunk
 
patronesdiseño2009.ppt
patronesdiseño2009.pptpatronesdiseño2009.ppt
patronesdiseño2009.ppt
OscargiovanniAndiaMo
 
02 -introduccion_a_la_tecnologia_orientada_a_objetos
02  -introduccion_a_la_tecnologia_orientada_a_objetos02  -introduccion_a_la_tecnologia_orientada_a_objetos
02 -introduccion_a_la_tecnologia_orientada_a_objetos
karlalopezbello
 
Introducción a DDD
Introducción a DDDIntroducción a DDD
Introducción a DDD
Mariano Sánchez
 
Trabajando con código heredado y ser feliz
Trabajando con código heredado y ser felizTrabajando con código heredado y ser feliz
Trabajando con código heredado y ser feliz
Diego Caballero
 
CC51A_Clase13-14_Patrones_Arquitectonicos.ppt
CC51A_Clase13-14_Patrones_Arquitectonicos.pptCC51A_Clase13-14_Patrones_Arquitectonicos.ppt
CC51A_Clase13-14_Patrones_Arquitectonicos.ppt
BayronHernandez12
 
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
Adrian Diaz Cervera
 
Modelo Orientado A Objetos
Modelo Orientado A ObjetosModelo Orientado A Objetos
Modelo Orientado A Objetos
jose_rob
 
Análisis y Diseño OO 2
Análisis y Diseño OO 2Análisis y Diseño OO 2
Análisis y Diseño OO 2
Jano González
 
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012Alfredo Chavez
 
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring -  Junta General del MexALN 28/06/2012Retos en la Adopción del Refactoring -  Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012Alfredo Chavez
 
Seminario SOLID-TDD
Seminario SOLID-TDDSeminario SOLID-TDD
Seminario SOLID-TDD
Gabriel Falcone
 
Programación orientada a objetos (POO) [JAVA]
Programación orientada a objetos (POO) [JAVA]Programación orientada a objetos (POO) [JAVA]
Programación orientada a objetos (POO) [JAVA]Hack '
 
Diapositiva de Estudio: FUNDAMENTOS UML.ppt
Diapositiva de Estudio: FUNDAMENTOS UML.pptDiapositiva de Estudio: FUNDAMENTOS UML.ppt
Diapositiva de Estudio: FUNDAMENTOS UML.ppt
jorgejvc777
 
Modelos para el desarrollo de software V3
Modelos para el desarrollo de software V3Modelos para el desarrollo de software V3
Modelos para el desarrollo de software V3
Marco Guerrero
 
Responsive en Drupal
Responsive en DrupalResponsive en Drupal
Responsive en Drupal
Alberto Rojas
 

Similar a Principios de diseño de código orientado a objetos SOLID (20)

Patrones de diseño
Patrones de diseñoPatrones de diseño
Patrones de diseño
 
U5.pptx
U5.pptxU5.pptx
U5.pptx
 
Deconstrucción de SOLID
Deconstrucción de SOLIDDeconstrucción de SOLID
Deconstrucción de SOLID
 
Day01
Day01Day01
Day01
 
patronesdiseño2009.ppt
patronesdiseño2009.pptpatronesdiseño2009.ppt
patronesdiseño2009.ppt
 
chuy
chuy chuy
chuy
 
02 -introduccion_a_la_tecnologia_orientada_a_objetos
02  -introduccion_a_la_tecnologia_orientada_a_objetos02  -introduccion_a_la_tecnologia_orientada_a_objetos
02 -introduccion_a_la_tecnologia_orientada_a_objetos
 
Introducción a DDD
Introducción a DDDIntroducción a DDD
Introducción a DDD
 
Trabajando con código heredado y ser feliz
Trabajando con código heredado y ser felizTrabajando con código heredado y ser feliz
Trabajando con código heredado y ser feliz
 
CC51A_Clase13-14_Patrones_Arquitectonicos.ppt
CC51A_Clase13-14_Patrones_Arquitectonicos.pptCC51A_Clase13-14_Patrones_Arquitectonicos.ppt
CC51A_Clase13-14_Patrones_Arquitectonicos.ppt
 
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
 
Modelo Orientado A Objetos
Modelo Orientado A ObjetosModelo Orientado A Objetos
Modelo Orientado A Objetos
 
Análisis y Diseño OO 2
Análisis y Diseño OO 2Análisis y Diseño OO 2
Análisis y Diseño OO 2
 
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
 
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring -  Junta General del MexALN 28/06/2012Retos en la Adopción del Refactoring -  Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
 
Seminario SOLID-TDD
Seminario SOLID-TDDSeminario SOLID-TDD
Seminario SOLID-TDD
 
Programación orientada a objetos (POO) [JAVA]
Programación orientada a objetos (POO) [JAVA]Programación orientada a objetos (POO) [JAVA]
Programación orientada a objetos (POO) [JAVA]
 
Diapositiva de Estudio: FUNDAMENTOS UML.ppt
Diapositiva de Estudio: FUNDAMENTOS UML.pptDiapositiva de Estudio: FUNDAMENTOS UML.ppt
Diapositiva de Estudio: FUNDAMENTOS UML.ppt
 
Modelos para el desarrollo de software V3
Modelos para el desarrollo de software V3Modelos para el desarrollo de software V3
Modelos para el desarrollo de software V3
 
Responsive en Drupal
Responsive en DrupalResponsive en Drupal
Responsive en Drupal
 

Último

Maquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdfMaquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdf
juanjosebarreiro704
 
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJECONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
SamuelGampley
 
Escaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipoEscaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipo
nicromante2000
 
Caso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La SalleCaso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La Salle
Ecaresoft Inc.
 
PitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitalesPitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitales
juanorejuela499
 
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdfIntroducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
AbbieDominguezGirond
 

Último (6)

Maquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdfMaquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdf
 
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJECONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
 
Escaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipoEscaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipo
 
Caso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La SalleCaso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La Salle
 
PitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitalesPitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitales
 
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdfIntroducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
Introducción_a_las_APIs_y_Desarrollo_Back-end-Abbie Dominguez Girondo.pdf
 

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

  • 1. Principios de diseño de código LUIS ALEXANDER ALDAZABAL GIL HTTP://CODE2READ.COM @BERCZECK
  • 2. 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
  • 4. ¿Cuántos fideos hay en la imagen? Ahora, ¿ Cuántos tipos de fideos hay?
  • 5. De esta forma ¿Es más fácil saber la respuesta?
  • 6. Entonces, ¿Vale la pena refactorizar código?
  • 7. Si nunca tenemos tiempo, ¿Cuándo vamos a escribir código con calidad?
  • 8. 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.
  • 9. ¿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.
  • 10. 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
  • 11. POO VS Programación estructurada
  • 12. ¿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.
  • 13. Tipos de Design Smells • Rigidez • Fragilidad • Inmovilidad • Viscosidad • Complejidad innecesaria • Repetición innecesaria • Opacidad
  • 14. 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.
  • 15. 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.
  • 16. 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.
  • 17. 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).
  • 18. 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.
  • 19. 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.
  • 20. 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.
  • 21. Principios de diseño orientados a objetos • DRY: • Dont repeat yourself • KISS: • Keep it simple stupid • Yagni: • You are going to need it
  • 22. 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.
  • 23. Principios de diseño orientados a objetos • SOLID: • Single Responsability • Open Closed • Liskov Substitution • Interface segregation • Dependency inversion
  • 24. 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.
  • 25. Principios de diseño orientados a objetos • SOLID - Single Responsability ¿Sobre qué artefactos aplica este principio? • Métodos • Clases • Paquetes • Módulos • Sistemas
  • 26. 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.
  • 27. 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.
  • 28. 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.
  • 29. 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.
  • 30. 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.
  • 31. 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
  • 32. 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.
  • 33. 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.
  • 34. 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.
  • 35. 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.
  • 36. 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.
  • 37. 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.
  • 38. Principios de diseño orientados a objetos • SOLID – Interface Segregation
  • 39. Principios de diseño orientados a objetos • SOLID – Interface Segregation
  • 40. 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.
  • 41. 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.
  • 42. 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
  • 43. 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.
  • 44. 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
  • 45. 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?