Interface Segregation Principle

Princípio da Segregação de Interfaces, em pt-BR.

Este princípio define que:

Uma classe nunca deve ser forçado a implementar uma interface ou método que ele não utiliza

Casos assim, normalmente ocorrem quando criamos classes ou interfaces muito genéricas com o intuito de "abraçar o mundo", ou seja, uma classe que tentar abranger todos os casos de um uso da nossa aplicação.

Como exemplo, vamos retornar a nossa classe Shape.

class Shape:

    def area(self):
        raise NotImplementedError("Subclasse should implement this")

A classe Shape, é normalmente utilizada como classe base para as classes Square e Circle, figuras geométricas cujas classes implementam o método area.

class Square(Shape):
	
    def __init__(self, lenght):
        super().__init__()
        self.lenght = lenght
        
    def area(self):
        return self.lenght ** 2
class Circle(Shape):
	
    def __init__(self, radius):
        super().__init__()
        self.radius = radius
    
    def area(self):
        return math.pi * self.radius ** 2

Agora vamos supor que desejemos tornar nossa classe Shape ainda mais abrangente, fazendo com que ela represente figuras geométricas 3D (cubo, esfera, etc.). Para isso, adicionamos a ela o método volume, responsável por calcular o volume dessas figuras.

class Shape:

    def area(self):
        raise NotImplementedError("Subclasse should implement this")
    
    def volume(self):
        raise NotImplementedError("Subclasse should implement this")

Agora repare que com a adição do método volume, todas as nossas subclasses também serão obrigadas a implementar esse método. Entretanto, não faz sentido algum as classes Square e Circle possuírem o método volume, já que elas representam figuras 2D (Quadrado e Círculo, respectivamente). Elas nem mesmo irão utilizar esse método. Ao forçarmos as classes Square e Circle implementarem o método volume, nós estamos desobedecendo ao Princípio da Segregação de Interfaces. O ideal nesse caso, seria criar uma nova classe diferente de Shape e fazer com que as subclasses representando figuras 3D implementem o método volume.

class Solid:
    
    def volume(self):
        raise NotImplementedError("Subclasse should implement this")

Fontes

https://web.archive.org/web/20150905081110/http://www.objectmentor.com/resources/articles/isp.pdf

Last updated