Hamburger Icon
Repaso a los principios SOLID: (I) Principio de Segregación de Interfaces

Repaso a los principios SOLID: (I) Principio de Segregación de Interfaces

¿Te suena la frase "Divide y vencerás"? No se conoce el origen exacto, pero uno de los primeros textos donde aparece es en El Arte de la Guerra, de Sun Tzu. Este señor del siglo V a.C nos ha influido mucho. Su obra es un tratado clásico sobre estrategia militar y tácticas que ha influido significativamente en la teoría actual, tanto militar como de estrategia empresarial y el pensamiento estratégico en general. Su enfoque nos viene de perlas.

Los principios SOLID son un conjunto de cinco principios de diseño de software que fueron propuestos por el programador Robert (tío Bob) Martin. Estos principios son guías que ayudan a desarrollar software que sea más mantenible, flexible y fácil de entender. Cada letra de la palabra "SOLID" representa uno de estos principios, en este post vamos a ver en qué consiste la I.

Antes de la I viene la L, por si te la saltaste.

ISP (Interface Segregation Principle)

El Principio de Segregación de Interfaces. Eso de segregar parece que tenga una cierta connotación negativa, sobretodo si estás estudiando o piensas en la historia del siglo XX, pero en este contexto solo significa "separar". Recuerda, divide y vencerás. Fue propuesto, como no, por nuestro querido Robert C. Martin.

Definición

Este principio se centra en cómo diseñar interfaces de manera efectiva para evitar la sobrecarga y la complejidad en las clases que las implementan. El ISP establece que una clase no debe verse obligada a implementar interfaces que no utiliza.

Visto de otro modo, es mejor tener interfaces específicas y coherentes para diferentes contextos, en lugar de una única interfaz monolítica que contenga métodos que no sean relevantes para todas las implementaciones.

Es recomendable dividir interfaces grandes y complejas en interfaces más pequeñas y cohesivas.

Vamos a hacer una analogía con Sun Tzu. Imagina una batalla en la que un general, que representa una interfaz de alto nivel llamada "Comandante en Jefe del Código", lidera a sus tropas, que son clases que implementan esta interfaz.

Beneficios

Evita la sobrecarga: las clases no están obligadas a implementar métodos que no necesitan. Siguiendo las enseñanzas de Sun Tzu, el general instruye a sus tropas (clases) para que se especialicen en áreas particulares de la batalla. Esto se traduce en implementar solo las interfaces que son relevantes para sus tareas específicas.

Mejora la cohesión: las interfaces más pequeñas y específicas permiten una mayor cohesión, ya que los métodos están relacionados directamente con el contexto. Sun Tzu enfatiza la importancia de la segmentación y la división de las fuerzas para lograr una estrategia eficaz.

En el contexto del ISP, el "Comandante en Jefe del Código" comprende que es más efectivo dividir una interfaz monolítica en interfaces más pequeñas y específicas.

Flexibilidad y extensibilidad: permite agregar nuevas interfaces sin afectar a las clases existentes, lo que hace que el sistema sea más flexible y extensible.

Al dividir las responsabilidades de manera estratégica y permitir que las tropas se enfoquen en sus tareas especializadas, el "Comandante en Jefe del Código" logra una coordinación más efectiva y un mejor rendimiento en la batalla del desarrollo de software.

Por ejemplo, las tropas de asalto implementan la interfaz "Asalto" y las tropas de reconocimiento implementan "Reconocimiento".

Facilita el mantenimiento: cambios en una interfaz específica no afectan a otras partes del sistema.

Al igual que Sun Tzu promovía la adaptabilidad en el campo de batalla, el enfoque del ISP permite que el "Comandante en Jefe del Código" pueda cambiar las estrategias más fácilmente sin afectar a todas las tropas.

Si una interfaz necesita modificarse, solo las clases relacionadas necesitan ajustarse.

Aplicación

Para aplicar este principio puedes intentar hacer lo siguiente:

Divide interfaces grandes en interfaces más pequeñas: si estás diseñando una interfaz grande que contiene una gran variedad de métodos, considera dividirla en interfaces más pequeñas y cohesivas. Cada interfaz debería tener un propósito claro y estar relacionada con un conjunto específico de comportamientos.

Utiliza herencia múltiple o implementación de múltiples interfaces: si una clase necesita proporcionar implementaciones para varios comportamientos, puede implementar múltiples interfaces que definan esos comportamientos. Esto evita que una única interfaz contenga una gran cantidad de métodos.

Refactoriza interfaces existentes: si ya tienes un código existente que no sigue el ISP, considera refactorizarlo para dividir las interfaces grandes en interfaces más pequeñas y específicas. Pero cuidado, ten en cuenta que esto puede requerir cambios en las clases existentes que implementan estas interfaces.

Conclusiones

El Principio de Segregación de Interfaces (ISP) aboga por interfaces específicas y cohesivas en lugar de interfaces grandes y monolíticas. Al seguir este principio, se crea un diseño más modular y mantenible en el que las clases solo implementan lo que necesitan y evitan la sobrecarga innecesaria.

En resumen, la aplicación efectiva del principio implica dividir interfaces grandes en interfaces más pequeñas y cohesivas, permitiendo que las clases implementen solo las interfaces relevantes para su contexto.

Esta analogía con Sun Tzu sirve como una fuente de inspiración para aplicar el ISP en el diseño de software.

Al igual que en la guerra, donde la segmentación estratégica y la especialización de las fuerzas son clave para la victoria, el ISP promueve la segmentación de interfaces y la especialización de clases para lograr un diseño más eficaz y flexible en el desarrollo de software.

Divide y vencerás. Luego, puedes seguir por el DIP.