Unidad I Sesión 4 - Solid
Unidad I Sesión 4 - Solid
Unidad I Sesión 4 - Solid
INDICE
Ocho años más tarde, el tío Bob siguió compendiando consejos y buenas prácticas de desarrollo
y se convirtió en el padre del código limpio con su célebre libro Clean Code.
Sin embargo, estos son los más conocidos y aplicados en el diseño orientado a objetos.
SOLID (Objetivos)
Entre los objetivos de tener en cuenta estos 5 principios a la hora de escribir
código encontramos:
En este sentido la aplicación de los principios SOLID está muy relacionada con la
comprensión y el uso de patrones de diseño, que nos permitirán mantener
una alta cohesión y, por tanto, un bajo acoplamiento de software.
¿Qué son la cohesión y el acoplamiento?
Acoplamiento
El acoplamiento se refiere al grado de interdependencia que tienen dos unidades de
software entre sí, entendiendo por unidades de software: clases, subtipos, métodos,
módulos, funciones, bibliotecas, etc.
Si dos unidades de software son completamente independientes la una de la otra,
decimos que están desacopladas.
Cohesión
La cohesión de software es el grado en que elementos diferentes de un sistema
permanecen unidos para alcanzar un mejor resultado que si trabajaran por separado.
Se refiere a la forma en que podemos agrupar diversas unidades de software para crear
una unidad mayor.
SOLID (Principios)
Los 5 principios SOLID de diseño de aplicaciones de software son:
Según este principio “una clase debería tener una, y solo una, razón para
cambiar”. Es esto, precisamente, “razón para cambiar”, lo que Robert C. Martin
identifica como “responsabilidad”.
El principio de Responsabilidad Única es el más importante y fundamental de
SOLID, muy sencillo de explicar, pero el más difícil de seguir en la práctica.
El propio Bob resume cómo hacerlo:
• Reúne las cosas que cambian por las mismas razones.
• Separa aquellas que cambian por razones diferentes.
Ejemplo SRP
Esta clase podría cambiar por
varias razones:
1. El mecanismo para enviar podríamos utilizar distintos patrones de diseño para resolver el
problema. En este caso en particular, vamos a separar cada una de
correos es diferente. Por las formas de mandar mensajes en clases diferentes.
ejemplo, antes se usaba un
Así, cada clase tendría una única razón para cambiar.
servidor SMTP y ahora se
requiere usar un API. Por ejemplo, si en algún momento cambia la plataforma de
mensajes de texto, solo tenemos que modificar la clase EnvioSMS. Y
2. Cambios en la plataforma de si en algún momento pasamos de enviar correos con un servidor
La clase Mensajero, en la imagen,
mensajes de texto. SMTP a un API de un tercero, solo impactamos la clase EnvioCorreo.
tiene dos responsabilidades:
3. Aparición de una nueva forma
1. enviar correos y
de enviar mensajes.
2. enviar mensajes de texto.
Acabamos de ver 3 razones
diferentes por las cuales la clase
podría cambiar. Esto nos puede
traer problemas de mantenibilidad.
Principio de Abierto/Cerrado
“You should be able to extend a classes behavior, without modifying it.”
Esto no sería lo más óptimo. Cada vez que añadamos una nueva forma de
envío, sería necesario modificar la clase Mensajero. Además, habría que
cambiar todos los lugares donde se llamen los métodos de Mensajero para
que tengan en cuenta la nueva forma de enviar mensajes.
Este es un ejemplo donde no estamos respetando el principio de abierto
cerrado.
Ejemplo Open/Close
¿Cómo lo podemos mejorar?
En el cuarto principio de SOLID, el tío Bob sugiere: “Haz interfaces que sean específicas
para un tipo de cliente”, es decir, para una finalidad concreta.
En este sentido, según el Interface Segregation Principle (ISP), es preferible contar con
muchas interfaces que definan pocos métodos que tener una interface forzada a
implementar muchos métodos a los que no dará uso.
Debemos tener cuidado con definir interfaces con muchos métodos. De acuerdo a este
principio, es mejor tener interfaces pequeñas, con pocos métodos muy relacionados
(alta cohesión), en lugar de tener interfaces voluminosas que obligan a definir
muchos métodos a quien las implementa.
Aquí el principio de única responsabilidad resulta muy útil, para separar esas interfaces
de la mejor manera.
Algunos patrones, especialmente los de comportamiento, pueden ser muy convenientes:
• Estrategia.
• Estado.
• Cadena de responsabilidad.
Principio de Inversión de Dependencias
“Depend on abstractions, not on concretions.”