SOLID: Princípio da Segregação da Interface

Princípio da Segregação da Interface e exemplos de implementação em Java 08 de agosto de 2023

O Princípio da Segregação da Interface (Interface Segregation Principle - ISP) é um dos princípios do SOLID, um conjunto de diretrizes para o desenvolvimento de software orientado a objetos. Este princípio estabelece que uma classe não deve ser forçada a depender de interfaces que não utiliza por completo. Neste artigo, iremos explorar o Princípio da Segregação da Interface e apresentar exemplos práticos de implementação em Java.

De acordo com o Princípio da Segregação da Interface, uma interface deve ser coesa e ter apenas o mínimo necessário para seus clientes. As interfaces devem ser segregadas de forma a cada cliente depender apenas dos métodos que precisa utilizar, evitando assim a dependência de funcionalidades desnecessárias.

Exemplos:

  1. Exemplo de violação do Princípio da Segregação da Interface:

     interface Animal {
         void comer();
         void dormir();
         void voar();
     }
        
     class Pato implements Animal {
         @Override
         public void comer() {
             System.out.println("Pato comendo");
         }
        
         @Override
         public void dormir() {
             System.out.println("Pato dormindo");
         }
        
         @Override
         public void voar() {
             System.out.println("Pato voando");
         }
     }
        
     class Cachorro implements Animal {
         @Override
         public void comer() {
             System.out.println("Cachorro comendo");
         }
        
         @Override
         public void dormir() {
             System.out.println("Cachorro dormindo");
         }
        
         @Override
         public void voar() {
             // Cachorro não voa, implementação desnecessária
         }
     }
    

    Neste exemplo, a interface Animal viola o Princípio da Segregação da Interface, pois obriga as classes Pato e Cachorro a implementarem o método voar(), sendo que apenas o pato possui essa capacidade. No caso do cachorro, a implementação do método é desnecessária e pode causar confusão.

  2. Exemplo de aplicação correta do Princípio da Segregação da Interface:

     interface Animal {
         void comer();
         void dormir();
     }
        
     interface Ave {
         void voar();
     }
        
     class Pato implements Animal, Ave {
         @Override
         public void comer() {
             System.out.println("Pato comendo");
         }
        
         @Override
         public void dormir() {
             System.out.println("Pato dormindo");
         }
        
         @Override
         public void voar() {
             System.out.println("Pato voando");
         }
     }
        
     class Cachorro implements Animal {
         @Override
         public void comer() {
             System.out.println("Cachorro comendo");
         }
        
         @Override
         public void dormir() {
             System.out.println("Cachorro dormindo");
         }
     }
    

    Neste exemplo, corrigimos a violação do Princípio da Segregação da Interface ao criar a interface Ave especificamente para os animais que possuem a capacidade de voar. A classe Pato agora implementa tanto a interface Animal quanto a interface Ave, atendendo apenas aos métodos relevantes para cada caso. A classe Cachorro depende apenas da interface Animal, não sendo afetada por funcionalidades desnecessárias.

Conclusão

O Princípio da Segregação da Interface é fundamental para garantir um código coeso e flexível. Ao aderir a esse princípio, é possível evitar a dependência de funcionalidades desnecessárias, tornando o sistema mais modular e de fácil manutenção. Os exemplos de implementação em Java mostram como corrigir violações do Princípio da Segregação da Interface, criando interfaces mais específicas e reduzindo o acoplamento entre as classes.

Ao aplicar o Princípio da Segregação da Interface em Java ou qualquer outra linguagem de programação, é importante analisar as necessidades de cada classe e criar interfaces que sejam adequadas e coesas para cada cliente. Dessa forma, é possível criar um código mais limpo, de fácil entendimento e que promova a reutilização de código.

Um grande abraço e até o próximo post!

Compartilhar: Twitter Facebook LinkedIn VK Reddit