General

Principios S.O.L.I.D

 

 

Introducción

En el desarrollo de software, existe un conjunto de principios conocidos como principios S.O.L.I.D. Estas reglas ayudan a mantener un código robusto, fácilmente manejable y que puede evolucionar con el proyecto. Fueron establecidos por Robert C. Martin, también conocido como Uncle Bob, a principios de los años 2000. S.O.L.I.D significa Responsabilidad Única, Abierto/Cerrado, Sustitución de Liskov, Segregación de Interfaces e Inversión de Dependencias. Vamos a explorar cada una de estas reglas para entender su importancia y cómo mejoran la calidad del software.

Este artículo es el primero de una serie que explora los principios S.O.L.I.D, con artículos futuros centrados en cada principio para explicar cómo mejoran el diseño del software.

Principio de Responsabilidad Única

El Principio de Responsabilidad Única (SRP) establece que una clase debe tener una sola razón para cambiar. Debe centrarse en una única responsabilidad o concepto en el sistema. Este principio fomenta que las clases sean altamente cohesivas, es decir, que se concentren en una tarea y sobresalgan en ella. Seguir el SRP hace que el código sea más modular y más sencillo de entender, probar y mantener.

Por ejemplo, en una aplicación bancaria, una clase Transacción debería ocuparse únicamente de registrar transacciones, mientras que una clase Usuario debería gestionar tareas relacionadas con el usuario, como la autenticación y la autorización. Si una clase tiene múltiples responsabilidades, modificar una parte de su comportamiento podría afectar inadvertidamente a otras funciones no relacionadas, resultando en una base de código frágil que viola el SRP.

Principio Abierto/Cerrado

El Principio Abierto/Cerrado sugiere que las clases deben estar abiertas para añadir nuevas funcionalidades pero cerradas para cambiar las existentes. Esto significa que se puede extender el funcionamiento de una clase sin cambiar su código original. Este principio fomenta el uso de abstracción y polimorfismo para hacer el diseño del software más flexible. Al crear clases que pueden extenderse mediante herencia o composición, los desarrolladores pueden agregar nuevas funciones sin cambiar el código actual. Esto ayuda a reducir las posibilidades de introducir errores o romper características existentes.

Por ejemplo, imagina un escenario en el que tienes una clase llamada Vehículo con funcionalidades básicas. Ahora, supongamos que quieres añadir características específicas para diferentes tipos de vehículos, como coches, motocicletas y camiones. En lugar de alterar la clase Vehículo existente, puedes crear nuevas clases como Coche, Motocicleta y Camión que extiendan o implementen la clase Vehículo. Diseñando las clases de esta manera, puedes introducir nuevas funcionalidades para cada tipo de vehículo sin poner en riesgo la integridad del código original.

Principio de Sustitución de Liskov

El Principio de Sustitución de Liskov (LSP) enfatiza que los objetos de una clase base deben ser reemplazables por objetos de sus clases derivadas sin afectar la corrección del programa. En otras palabras, una clase derivada debe ser un sustituto de su clase base sin alterar el comportamiento del programa.

Por ejemplo, considera un escenario en el que un sistema depende de una clase base Figura con clases derivadas Círculo y Cuadrado. Según el LSP, cualquier operación que funcione sobre una Figura también debe funcionar sobre sus clases derivadas sin causar un comportamiento inesperado.

Principio de Segregación de Interfaces

El Principio de Segregación de Interfaces sugiere que los clientes no deben verse forzados a depender de interfaces que no utilizan. En lugar de crear interfaces grandes que contengan múltiples métodos, los desarrolladores deben diseñar interfaces más pequeñas y específicas que se ajusten a los requisitos de los clientes individuales. Este principio ayuda a prevenir la creación de interfaces "gordas" que contienen métodos irrelevantes para ciertos clientes, reduciendo así el acoplamiento.

Por ejemplo, piensa en una interfaz llamada IDocumento que tiene métodos para leer y escribir documentos. Pero algunos clientes solo necesitan leer documentos. Siguiendo el ISP, los desarrolladores pueden crear interfaces separadas como ILectura y IEscritura que cumplan con las necesidades específicas de los clientes. Este método reduce el acoplamiento entre componentes, mejora la legibilidad del código y facilita el mantenimiento.

Principio de Inversión de Dependencias

El Principio de Inversión de Dependencias aboga por que los módulos de alto nivel no dependan de módulos de bajo nivel, sino de abstracciones. Este principio fomenta que los desarrolladores desacoplen las clases introduciendo interfaces o clases abstractas que sirvan como contratos entre ellas. Al depender de abstracciones en lugar de implementaciones concretas, el código se vuelve más flexible y resistente a los cambios. El DIP permite la sustitución de dependencias en tiempo de ejecución, facilitando pruebas, simulaciones y mantenimiento más sencillos.

Por ejemplo, en lugar de instanciar directamente dependencias dentro de una clase, los desarrolladores pueden depender de la inyección de dependencias o de contenedores de inversión de control para proporcionar las dependencias en tiempo de ejecución.

Resumen

Los principios S.O.L.I.D sirven como un marco fundamental para escribir software de alta calidad, mantenible y escalable. Al entender y aplicar estos principios, los desarrolladores pueden escribir código que sea más fácil de comprender, probar y evolucionar con el tiempo. En el próximo artículo de la serie, profundizaremos en el primer principio: el Principio de Responsabilidad Única.