Interface Segregation: cuándo separar contratos

Clase 9 de 27Curso de Patrones de Diseño y SOLID en Python

Resumen

Domina la letra I de los principios S.O.L.I.: el principio de segregación de interfaces. Su enfoque es directo: los clientes no deberían depender de interfaces que no utilizan. Al separar comportamientos, se mejora la cohesión, se reduce el acoplamiento y se facilita la reutilización y las pruebas unitarias.

¿Qué es el principio de segregación de interfaces y por qué importa?

El Interface Segregation Principle (ISP) establece que una clase no debe verse obligada a implementar métodos que no necesita. En otras palabras, se deben segmentar los procedimientos en interfaces más pequeñas y específicas, evitando interfaces “infladas”. Así, cada entidad implementa solo lo que realmente usa.

  • Cohesión alta: cada interfaz agrupa comportamientos relacionados y nada más.
  • Acoplamiento bajo: los cambios en una interfaz no arrastran a otras clases.
  • Reutilización de componentes: comportamientos separados se emplean en distintos contextos sin dependencias innecesarias.
  • Pruebas unitarias más simples: al tener interfaces acotadas, el contexto de prueba es más concreto y manejable.
  • Máxima clave: mejorar la cohesión y disminuir el acoplamiento.

¿Cómo se aplica con ejemplos prácticos de impresión y escaneo?

El contenido diferencia claramente operaciones de impresión y escaneo. Si una impresora multifuncional necesita ambos comportamientos, implementa dos interfaces segregadas; si no, cada dispositivo se mantiene enfocado.

  • Impresora que solo imprime: implementa únicamente la interfaz de impresión.
  • Escáner que solo escanea: implementa únicamente la interfaz de escaneo.
  • Impresora multifuncional: implementa ambas interfaces, sin obligar a otras clases a heredar comportamientos que no usan.

Esta separación evita que una clase adopte métodos irrelevantes, promueve cohesión en cada interfaz y reduce acoplamiento entre componentes.

¿Cuándo conviene aplicarlo y qué beneficios aporta?

Hay señales claras para aplicar el ISP. Si una interfaz crece demasiado o muchas clases ignoran parte de sus métodos, es momento de segregar. Además, cuando un cambio en la interfaz afecta a múltiples clases, la separación se vuelve prioritaria.

  • Interfaces con demasiados métodos irrelevantes.
  • Clases que no usan todos los métodos definidos.
  • Cambios en una interfaz que impactan a muchas clases.

Beneficios directos al aplicar el principio:

  • Mejora la cohesión al mantener comportamientos relacionados juntos.
  • Reduce el acoplamiento al aislar contratos y minimizar dependencias cruzadas.
  • Permite reutilización de las interfaces específicas en distintas partes del código.
  • Aísla cambios: modificar una interfaz no obliga a cambiar otras.
  • Facilita pruebas unitarias gracias a contextos más pequeños y claros.

¿Tienes ideas para aplicarlo al código del procesador de pagos? Comparte en comentarios cómo segregarías interfaces y qué clases deberían implementar cada comportamiento.