Interface Segregation Principle

Open In Colab

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.