Explicando de Forma Simples Single Responsibility Principle (SRP)


A metodologia SOLID é um conjunto de cinco princípios fundamentais que tornam o código mais limpo, flexível e fácil de manter. No desenvolvimento em PHP, aplicá-los ajuda a reduzir erros, melhorar a legibilidade e permitir que sistemas cresçam sem quebras inesperadas.

A letra S do SOLID signigica Single Responsibility Principle e tem a abreviatura (SRP)

O próprio nome Single Responsibility Principle já diz: é o princípio da responsabilidade única, então cada classe de nosso sistema deverá ter uma única responsabilidade.

Abaixo vamos demonstrar as diferenças, veja:

Do lado esquerdo temos um exemplo de uma classe php aplicando o Explicando de Forma Simples Single Responsibility Principle (SRP)
Do lado esquerdo temos um exemplo de uma classe php aplicando o Explicando de Forma Simples Single Responsibility Principle (SRP)

O script sem o Single Responsibility Principle

Explodindo o exemplo dado como “errado“, vemos:

  • que a class Usuario contem o método (function) salvar,
  • sem precisar de muita explicação, vemos que fica estranho, pois para aplicar o salvar(),
  • a “public function salvar ()” este necessitaria de configurações de coneção com banco ou apontamentos a endpoint’ de api, bagunçando tudo – mistrurando responsabilidades.
  • no mesmo sentido a “public function enviarEmail ()“, onde o próprio nome dita: vai enviar um e-mail. Que no caso é uma responsabilidade estranha à administração de dados atinentes ao usuário (class Usuario)

Este é o ponto, separar tudo em seu devido lugar, sua devida responsabilidade única, que é exatamente o conceito de SINGLE, a letra ‘S’ do SOLID.

// 1) Classe User com múltiplas responsabilidades
class Usuario
{
    public string $nome;
    public string $email;

    public function salvar() // responsabilidade 01
    {
        // Mistura lógica de persistência de dados
        echo "Salvando {$this->nome} no banco...\n";
    }

    // responsabilidade 02 (enviar e-mail difere de Salvar)
    public function enviarEmail(string $mensagem) 
    {
        // Mistura lógica de envio de email
        echo "Enviando email para {$this->email}: $mensagem\n";
    }
}

// Uso problemático
$usuario = new Usuario();
$usuario->nome = "João";
$usuario->email = "joao@email.com";

$usuario->salvar();
$usuario->enviarEmail("Bem-vindo!");

// Problema:
// A classe Usuario faz mais de uma coisa: gerencia dados, 
// salva no banco e envia emails.
// Dificulta testes unitários, reuso de código e manutenção futura.

O script aplicando o Single Responsibility Principle

Vemos que a antes a class Usuario estrapolava suas responsabilidades, incorporando funções como salvar e enviar e-mail.

Agora aplicando ao script o conceito de Single Responsibility Principle (SRP), ja vemos 03 classes separadas.

Perceba que o nome das classes já dá a ela sua devida resposabilidade. Ao nomear uma classe, se vc perceber que o nome ficou muito complexo, pode desconfiar que tem algum erro.

Ex: class ServicoEmail > function enviar ()

Neste exemplo da class ServicoEmail, é nitido que ele incorporará funções atinentes às tarefas relacionadas à e-mail. Assim, quando um comando venha a necessitar de enviar um e-mail a um determinado usuário ou a um envio em massa, basta usar essa classe ServicoEmail, a qual esta devidamente separada em sua responsabilidade única, que é serviços de e-mail.

class Usuario
{
    public string $nome;
    public string $email;
}

// 2) Classe responsável apenas pela persistência de dados
class RepositorioUsuario
{
    public function salvar(Usuario $usuario)
    {
        echo "Salvando {$usuario->nome} no banco...\n";
        // Aqui poderia ter código real de INSERT ou UPDATE no banco
    }
}

// 3) Classe responsável apenas pelo envio de emails
class ServicoEmail
{
    public function enviar(Usuario $usuario, string $mensagem)
    {
        echo "Enviando email para {$usuario->email}: $mensagem\n";
        // Aqui poderia usar mail(), PHPMailer, etc.
    }
}

// Uso correto
$usuario = new Usuario();
$usuario->nome = "João";
$usuario->email = "joao@email.com";

$repositorio = new RepositorioUsuario();
$repositorio->salvar($usuario);
echo '<hr>';

$servicoEmail = new ServicoEmail();
$servicoEmail->enviar($usuario, "Bem-vindo!");

Conclusão

A letra S do SOLID é de fácil entendimento e de fácil aplicação. Dê a uma classe uma única responsabilidade, pronto, acabou, sem rodeios.

Veja os arquivos em nosso git https://github.com/Tellys/solid-principles/tree/f7a3520b5b3150639644354bb036d8746c33fac8/Simples%20Single%20Responsibility%20Principle%20(SRP)