[S.O.L.I.D.] Os Cinco Pilares da Programação Orientada a Objetos. [I] - Interface Segregation Principle - ISP
Tags: java, solidprinciples
Published: 2024-05-25 01:38:31

Continuando a série sobre SOLID, caso não tenha lido o artigo anterior:

{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-l-liskov-substitution-principle-lsp-5ebg %}

Neste artigo estarei falando sobre o **quarto princípio** que é:

**[I] -Interface Segregation Principle,**
**Princípio da Segregação de Interfaces - ISP**
“os clientes que implementam uma interface não devem ser obrigados a implementar uma ação/método que não utiliza”

Definição: Os clientes não devem ser forçados a depender de interfaces que não utilizam. Em outras palavras, é melhor ter várias interfaces específicas do que uma única interface geral.

Vamos considerar um exemplo do mundo real envolvendo um sistema de gerenciamento de funcionários em uma empresa. Este sistema precisa lidar com diferentes tipos de funcionários, como funcionários regulares, gerentes e funcionários terceirizados. Inicialmente, podemos ter uma interface única para gerenciar todos os tipos de funcionários, mas aplicaremos o ISP para melhorar o design.

_Sem ISP_
**Interface EmployeeManagement sem ISP**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yot7mtnguqhcqvmkcg3l.png)

**Implementação HRSystem sem ISP**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nn187b5kthie32ynvlnw.png)

Neste exemplo, HRSystem é forçado a implementar métodos que não fazem sentido para ele (manageContractors), o que viola o ISP.

_Com ISP_
Para seguir o ISP, vamos dividir a interface EmployeeManagement em interfaces específicas para diferentes tipos de funcionários.

**Interface EmployeeManagement**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2mqmqp14taewzgrvwe3e.png)

**Interface ContractorManagement**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ekb3qblzbkrgcm6rhd7i.png)

**Implementação HRSystem com ISP**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uucjy95opxbztbkkwg3z.png)

**Implementação ContractorManagementSystem com ISP**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xkhwk4tvyom4wgywi40y.png)

**Uso das Classes**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvfx1kydrb0eagkmuqpd.png)

Explicação:

- Interface EmployeeManagement: Define operações genéricas para gerenciamento de funcionários, como contratação, atribuição de tarefas, cálculo de salário, etc.
- Interface ContractorManagement: Define operações específicas para gerenciamento de contratados, como gerenciamento de contratos.
- Classe HRSystem: Implementa a interface EmployeeManagement, fornecendo métodos para gerenciar funcionários da empresa.
- Classe ContractorManagementSystem: Implementa a interface ContractorManagement, fornecendo métodos para gerenciar contratados.
- Uso das Classes: Demonstramos como usar as diferentes classes e interfaces de maneira específica, sem forçar nenhuma classe a implementar métodos desnecessários.

**Ao seguir o Princípio da Segregação de Interfaces, garantimos que nossas classes só implementem métodos que fazem sentido para elas, tornando o código mais claro e fácil de manter. Isso evita que classes dependam de métodos que não utilizam, promovendo uma melhor coesão e separação de responsabilidades.**

_PS: Para ir direto para o próximo princípio:_
{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-d-dependency-inversion-principle-dip-2d5n %}