SlideShare una empresa de Scribd logo
1 de 46
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

Ejercicios de test - desarrollo y programación
Ejercicios de test  -  desarrollo y programaciónEjercicios de test  -  desarrollo y programación
Ejercicios de test - desarrollo y programación
oposicionestic
 
Design patterns ppt
Design patterns pptDesign patterns ppt
Design patterns ppt
Aman Jain
 
SOLID Design Principles
SOLID Design PrinciplesSOLID Design Principles
SOLID Design Principles
Samuel Breed
 

La actualidad más candente (20)

Solid Principle
Solid PrincipleSolid Principle
Solid Principle
 
Association agggregation and composition
Association agggregation and compositionAssociation agggregation and composition
Association agggregation and composition
 
Solid Principles
Solid PrinciplesSolid Principles
Solid Principles
 
Inter thread communication
Inter thread communicationInter thread communication
Inter thread communication
 
S.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software ArchitectsS.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software Architects
 
Metodología ICONIX
Metodología ICONIXMetodología ICONIX
Metodología ICONIX
 
Object-oriented concepts
Object-oriented conceptsObject-oriented concepts
Object-oriented concepts
 
Binary Search Tree
Binary Search TreeBinary Search Tree
Binary Search Tree
 
Ejercicios de test - desarrollo y programación
Ejercicios de test  -  desarrollo y programaciónEjercicios de test  -  desarrollo y programación
Ejercicios de test - desarrollo y programación
 
Liscov substitution principle
Liscov substitution principleLiscov substitution principle
Liscov substitution principle
 
Solid principles
Solid principlesSolid principles
Solid principles
 
Design patterns ppt
Design patterns pptDesign patterns ppt
Design patterns ppt
 
Evaluation of postfix expression
Evaluation of postfix expressionEvaluation of postfix expression
Evaluation of postfix expression
 
Balance tree. Short overview
Balance tree. Short overviewBalance tree. Short overview
Balance tree. Short overview
 
Clean code
Clean codeClean code
Clean code
 
Design patterns tutorials
Design patterns tutorialsDesign patterns tutorials
Design patterns tutorials
 
Software Design Patterns
Software Design PatternsSoftware Design Patterns
Software Design Patterns
 
SOLID Design Principles
SOLID Design PrinciplesSOLID Design Principles
SOLID Design Principles
 
Object oriented vs. object based programming
Object oriented vs. object based  programmingObject oriented vs. object based  programming
Object oriented vs. object based programming
 
Design Pattern - Factory Method Pattern
Design Pattern - Factory Method PatternDesign Pattern - Factory Method Pattern
Design Pattern - Factory Method Pattern
 

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ño
aleja0940
 
CC51A_Clase13-14_Patrones_Arquitectonicos.ppt
CC51A_Clase13-14_Patrones_Arquitectonicos.pptCC51A_Clase13-14_Patrones_Arquitectonicos.ppt
CC51A_Clase13-14_Patrones_Arquitectonicos.ppt
BayronHernandez12
 
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
Alfredo 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/2012
Alfredo Chavez
 
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 '
 
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
 

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
 

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?