martes, 28 de junio de 2016

Introdución a los Principios SOLID

SOLID es un acrónimo para una serie de principios básicos, 5 en total,  de la programación orientada a objetos (POO) y el diseño orientado a objetos (OOD) inventado por Robert C. Martin. Estos principios tienen relación con algunos patrones de diseño.
Muchos creen que el objetivo de la arquitectura de software, los patrones de diseño y los principios SOLID es programar más rápido. Pero no. La verdad es que el objetivo real es facilitar el mantenimiento de los grandes proyectos de software. Como norma el mantenimiento consume muchos recursos de los destinados a los proyectos de software, hasta un promedio de 77%, por lo que los ahorros en esfuerzos en esta área son cruciales para facilitar el sostenimiento de una plataforma de software o de soluciones de software cualquiera.


En forma general estos principios son los que a continuación se detallan…


Responsabilidad Simple (Single Responsibility)
Zapatero a su zapato y pastelero a sus pasteles, dice el dicho popular, y en la POO es también una realidad deseable.
Este principio establece que las clases y sus métodos deben ser atómicos en su funcionalidad.
En otras palabras. Cada clase debe ser diseñada con un propósito u objetivo específico, y cada uno de los métodos de esa clase debe realizar una sola tarea, y hacerla bien.
Muchas veces nos encontramos trabajando en una clase, y tenemos la necesidad de escribir un método que no está directamente relacionado con esa clase y su propósito; es allí cuando nos vemos tentados a decir “bueno, para que voy a crear otra clase si ya estoy aquí…. Seguro que esto no lo vuelvo a necesitar mas, y si llego a necesitarlo seguro recordare donde buscarlo”.
Y es así como terminamos con una clase que maneja conexiones de red que tiene métodos para formatear cadenas caracteres, por ejemplo.
Esto a la larga resulta en una dificultad mayor para administrar las clases y sus métodos, dificultando la administración general del sistema.

Abierto/Cerrado (Open Closed)
Lo que funciona NO lo arregles. Otra verdad cotidiana que tiene su contraparte en el mundo de la POO. Este principio se le atribuye a Bertrand Meyer, y establece que las clases y los programas o sistemas deben estar Abiertos a la Ampliación pero Cerrados a la Modificación.
En otras palabras, debemos poder extender las capacidades de un sistema sin tener la necesidad de modificar o cambiar las otras partes ya existentes. Podemos incorporar nuevas clases y actualizar configuraciones, pero no deberíamos tener que modificar las clases ya existentes.
Esto por lo general se logra usando patrones de diseño, tales como lo son comando y estrategia, Factory, etc.
Así mismo hace uso de otro principio de diseño que establece que hay que favorecer la composición y la agregación antes que la herencia de clases.
Por otro lado también se relaciona con el principio que establece que hay que programar y diseñar para una Abstracción (Interface, Clase Abstracta, etc.) y no para una implementación concreta.
En general se persigue que las clases encapsulen comportamiento, y que este comportamiento, por lo tanto, pueda ser reemplazado cambiando las implementaciones, incluso agregando nuevas, pero sin modificar las interfaces o contrato de comunicación de las diversas clases que conforman la solución de software. De esta forma nuestros sistemas pueden ser ampliados sin tener que ser modificados.

Sustitución Liskov (Liskov substitution)
Este principio fue establecido por Barbara Liskov y habla de la importancia de crear todas las clases derivadas para que también puedan ser tratadas como la propia clase base.
En otras palabras, si todo funciona con la clase base, debería seguir funcionando si la cambiamos por una subclase.
El problema es que en muchas ocasiones la herencia trae consigo comportamientos inesperados, sobre todo cuando se mantienen largas jerarquías de herencia (muchos niveles) y se sobre escriben muchos métodos.
Un ejemplo es la clase Cuadrado. Matemáticamente hablando un Cuadrado es un caso especial de los Rectángulos, sólo que tiene ambos lados iguales, por lo que podemos decir que un Cuadrado ES-UN Rectángulo. Pero qué ocurre con el método setWidth (establecerAncho) del Cuadrado, si alguien lo implementa decidiendo modificar también el alto (debido a que deben ser iguales) dentro de este método. Al usar la sub clase, clase derivada, Cuadrado en lugar de un Rectángulo, voy a obtener comportamientos no esperados al momento de trabajar con sus métodos.
Puede parecer engañosamente simple resolver estos conflictos o tenerlos en cuenta, pero por lo general es difícil verlos al momento del diseño.

Segregación de interfaces (Interface segregation)
Robert C. Martin estableció que las interfaces (y las clases abstractas) deben definir un conjunto de métodos estrechamente relacionados a un objetivo. En otras palabras, es mejor tener varias interfaces pequeñas, pero con métodos específicos a una tarea determinada, que una sola gran interface con un montón de métodos que, seguramente, no serán requeridos todos juntos en algún momento.
Tener interfaces con un gran número de métodos cuando sólo se precisan algunos de ellos, lleva a tener implementaciones de métodos Dummy o tontos, vacíos, cuya existencia solo se justifica para dar cuerpo a todos los métodos de la interface.

Inversión de dependencias (Dependency inversion)
La Inversión de Dependencias establece que si una clase depende de otra, esta dependencia debe venir orientada o dada por una dependencia de interfaces y no de una clase concreta.
Este concepto también se relaciona con la Inyección de dependencias y la dependencia de módulos, la primera implica la inyección de una implementación de una clase sin tener que hacer new(); el segundo nos habla sobre las distintas capas de un sistema, donde los diversos módulos internos no deberían depender de elementos más externos o internos a ellos mismos. Por ejemplo, un módulo de la capa de negocios no debería tener dependencias con la capa de front-end o pantallas (formularios, etc.) de la aplicación.


Como ven, son principios relativos al diseño y construcción de sistemas orientados a objeto. Les dejo un enlace a este genial artículo sobre los principios SOLID.

No hay comentarios:

Publicar un comentario