O que é e como se usa o SRP?

O princípio de Responsabilidade Única (SRP - Single Responsibility Principle) é um dos princípios SOLID, amplamente utilizado na engenharia de software. Ele estabelece que uma classe ou módulo deve ter apenas uma única responsabilidade.

De acordo com o SRP, uma classe deve ser responsável por um e apenas um aspecto ou funcionalidade de um sistema. Isso ajuda a garantir a coesão das classes, tornando-as mais focadas e com uma responsabilidade clara. Além disso, também facilita a manutenção do código, pois alterações em uma responsabilidade não afetam outras partes do sistema.

Para aplicar o SRP, é importante identificar as responsabilidades existentes em um sistema e dividir essas responsabilidades entre classes ou módulos separados. Cada classe/módulo deve ter uma única responsabilidade e não deve ser afetado por mudanças em outras partes do sistema.

Vamos considerar um exemplo: suponha que temos um sistema de vendas online. Podemos ter uma classe chamada “Carrinho de Compras”, cuja responsabilidade é gerenciar todos os itens adicionados ao carrinho, calcular o valor total da compra, aplicar descontos, entre outras tarefas relacionadas ao processo de compra.

No entanto, se essa mesma classe também for responsável por enviar e-mails de confirmação para o cliente, isso iria contra o SRP, pois ela estaria tendo duas responsabilidades diferentes. Nesse caso, seria melhor extrair a responsabilidade de envio de e-mails para uma classe separada, como por exemplo a “NotificaçãoService”.

Dessa forma, temos duas classes com responsabilidades distintas: “Carrinho de Compras” para gerenciar o carrinho e calcular o valor total da compra, e “NotificaçãoService” para lidar com o envio de e-mails.

Aplicar o SRP traz benefícios, como código mais legível, flexível e com baixo acoplamento. Além disso, torna o sistema mais fácil de ser testado, pois cada classe/módulo pode ser testado isoladamente.

Portanto, o SRP é um princípio fundamental para a criação de um código de qualidade e compreensível, que favorece a manutenibilidade e a escalabilidade do sistema.