2.4. Interface Segregation Principle#
El Principio de Segregación de Interfaces (Interface Segregation Principle - ISP) es uno de los cinco principios SOLID del diseño de software. Fue propuesto por Robert C. Martin en su libro “Diseño Ágil: Principios, Patrones y Prácticas en C#”. El ISP establece que una clase no debe ser forzada a depender de métodos que no utiliza. En lugar de tener interfaces grandes que contienen métodos para diferentes casos de uso, se deben tener varias interfaces más pequeñas y específicas que satisfagan las necesidades de cada cliente.
2.4.1. Definición del ISP:#
El principio ISP establece que los clientes no deben verse obligados a depender de interfaces que no utilizan. En otras palabras, una interfaz no debe contener métodos que no son relevantes para todos los clientes que la implementan. En lugar de una única interfaz grande, se deben tener múltiples interfaces más pequeñas y específicas, cada una diseñada para satisfacer las necesidades de un conjunto específico de clientes.
2.4.2. Ejemplo del ISP:#
Supongamos que tenemos una interfaz Machine
que define varios métodos para diferentes tipos de máquinas, como impresoras y escáneres. Siguiendo el principio ISP, dividiremos esta interfaz en interfaces más pequeñas y específicas que satisfagan las necesidades de cada tipo de máquina.
from abc import ABC, abstractmethod
# Interfaz original
class Machine(ABC):
@abstractmethod
def print(self):
pass
@abstractmethod
def scan(self):
pass
# Interfaz segregada
class Printer(ABC):
@abstractmethod
def print(self):
pass
class Scanner(ABC):
@abstractmethod
def scan(self):
pass
# Clase que implementa la interfaz segregada
class AllInOneMachine(Printer, Scanner):
def print(self):
print("Printing")
def scan(self):
print("Scanning")
# Uso del principio ISP
all_in_one = AllInOneMachine()
all_in_one.print() # Printing
all_in_one.scan() # Scanning
Printing
Scanning
En este ejemplo, la interfaz Machine
se ha dividido en dos interfaces más pequeñas y específicas: Printer
y Scanner
. Ahora, la clase AllInOneMachine
implementa solo los métodos relevantes para una máquina que es capaz de imprimir y escanear. Esto sigue el principio ISP, ya que los clientes de la interfaz Printer
no se ven obligados a depender de un método de escaneo que no necesitan, y viceversa. Esto hace que el diseño sea más flexible y mantenible.