[S.O.L.I.D.] Os Cinco Pilares da Programação Orientada a Objetos. [S] - Single Responsibility Principle - SRP
Tags: java, solidprinciples
Published: 2024-05-24 18:57:59

Olá devs, venho trazer uma série de 5 artigos abordando com teoria e exemplos de código em java, cada letra que simboliza os princípios da palavra SOLID, caso você não saiba, SOLID é um acrônimo para cinco princípios fundamentais do design orientado a objetos (POO), estabelecidos por Robert C. Martin ("Uncle Bob"). Esses princípios visam aprimorar a qualidade, a manutenibilidade e a extensibilidade do código, tornando-o mais robusto e resiliente às mudanças.

Neste artigo comecarei falando sobre o **primeiro princípio** que é:
       
**[S] - Single Responsibility Principle**,
 **Princípio da Responsabilidade Única - SRP**
“Nunca deve haver mais de um motivo para uma classe mudar.”

Afirma que cada módulo de software (classe, método, etc.) deve ter apenas uma única responsabilidade. Em outras palavras, cada módulo deve ser responsável por uma única função bem definida e não deve se preocupar com nenhuma outra função.

Vantagens do SRP:

1. Maior modularidade: O SRP leva a um código mais modular, o que facilita o entendimento, a manutenção e a reutilização. Módulos menores e mais focados são mais fáceis de compreender e modificar, sem afetar outras partes do código.
2. Maior coesão: O SRP promove maior coesão dentro dos módulos, garantindo que cada módulo se concentre em uma única tarefa e que todo o código dentro do módulo esteja relacionado a essa tarefa. Isso resulta em um código mais organizado e menos propenso a erros.
3. Maior flexibilidade: O SRP torna o código mais flexível e adaptável a mudanças. Se a necessidade de modificar o código surgir, é mais provável que apenas um módulo precise ser alterado, minimizando o impacto em outras partes do sistema.
4. Maior testabilidade: O SRP facilita a testabilidade do código, pois cada módulo pode ser testado de forma independente, isolando-o de outras dependências. Isso garante que cada módulo funcione conforme o esperado e facilita a identificação de erros.
5. Maior reutilização: O SRP promove maior reutilização de código, pois módulos com única responsabilidade são mais fáceis de serem entendidos e integrados em outros projetos.

Dividir uma classe grande em classes menores: Se uma classe possui várias responsabilidades distintas, ela pode ser dividida em classes menores, cada uma com uma única responsabilidade.
Criar interfaces para abstrair responsabilidades: Interfaces podem ser usadas para abstrair responsabilidades de classes concretas, permitindo que diferentes classes implementem a mesma interface de maneiras diferentes.

Vamos a um exemplo com e sem SRP.

Classe EmployeeService sem SRP


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

Nesta implementação, a classe EmployeeService lida com:

- Operações CRUD para Employee.
- Envio de notificações por email.
- Gerenciamento de endereços.
- Isso torna a classe difícil de manter e estender, pois mudanças em uma responsabilidade podem afetar outras.

Com SRP
Aplicando o SRP, separamos as responsabilidades em diferentes classes, cada uma com uma única responsabilidade. Isso torna o código mais modular e fácil de manter.

_Classe EmployeeService com SRP_

**Classe EmployeeService**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7e59vd8wfy4bfey2gsr0.png)

**Classe NotificationService**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pci6fs1xmst9qzqcnve7.png)

**Classe AddressService**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xh5fc9itkve6un7kpsls.png)

**Classe EmployeeRepository**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rhw36p4w4d1k8nud0ssg.png)

**Classe AddressRepository**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sca1dknoy8021zngpqxh.png)

**Ao aplicar o SRP, separamos claramente as responsabilidades, facilitando a manutenção e a extensão do código. Agora, cada classe tem uma única responsabilidade, tornando o sistema mais modular e fácil de entender.**

_PS: Para ir direto para o próximo princípio:_
{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-o-openclosed-principle-ocp-3bal %}