SRP: o que é, o princípio da responsabilidade única no desenvolvimento

Autor: IT Sectr Publicado: 2026-05-11 Tempo de leitura: 9 min

SRP (Single Responsibility Principle) — o primeiro princípio do SOLID, que define: cada classe ou módulo deve ter exatamente um motivo para mudar. Este princípio foi formulado por Robert Martin no livro Clean Architecture (2017) e tornou-se a base do design modular. De acordo com este livro, aplicar SRP reduz diretamente o acoplamento de componentes e elimina mudanças em cascata ao modificar funcionalidades.

Pontos principais

  • SRP — o primeiro princípio SOLID, exigindo uma responsabilidade por classe
  • Motivo para mudar — o único critério para atribuir responsabilidade a um módulo
  • Violar SRP leva a código acoplado, difícil de testar e estender
  • Aplicar o princípio simplifica a refatoração e reduz o risco de erros de regressão
  • SRP no desenvolvimento mobile ajuda a separar lógica de UI, regras de negócio e manipulação de dados

O que é SRP (Single Responsibility Principle)?

SRP (Single Responsibility Principle) é o princípio da responsabilidade única, que afirma: cada classe ou módulo deve ter exatamente um motivo para mudar. Isso não significa que uma classe deve realizar exatamente uma operação. Refere-se a um grupo de ações relacionadas unidas por uma única responsabilidade perante um ator.

Robert Martin reformulou o SRP em termos de atores: uma classe deve mudar apenas a pedido de uma parte interessada ou de um grupo de pessoas. Se dois atores diferentes exigem mudanças na mesma classe, a responsabilidade está mal dividida.

Por exemplo, uma classe Employee que calcula salário (solicitação do departamento de contabilidade) e gera relatórios (solicitação da gerência) viola o SRP. Alterar regras de cálculo pode afetar a geração de relatórios e vice-versa.

Definição formal de SRP

Um módulo deve ter um e apenas um motivo para mudar. O motivo da mudança é determinado por um ator — pessoa ou sistema que inicia o requisito. Se requisitos de diferentes atores levam a mudanças em um mesmo módulo, este viola o SRP.

O conceito de ator torna o SRP uma ferramenta prática de análise arquitetural, não uma recomendação abstrata. Ao projetar um sistema, basta perguntar: “Quem vai pedir para mudar este código?” — se a resposta incluir mais de uma parte interessada, a responsabilidade deve ser dividida.

Como funciona o princípio da responsabilidade única

A responsabilidade única é implementada agrupando métodos que mudam por um mesmo motivo. A classe torna-se um “ponto de coleta” de lógica relacionada, não um “canivete suíço” para todas as ocasiões. Isso simplifica a compreensão do código: o desenvolvedor vê a classe e entende imediatamente seu propósito.

O mecanismo do SRP baseia-se na regra do eixo único de mudança. Se uma funcionalidade pode mudar por razões independentes, ela deve ser extraída para classes separadas. As conexões entre essas classes são construídas através de composição ou delegação.

A violação do SRP manifesta-se em “God Objects” — classes com dezenas de métodos que trabalham com dados diferentes. Uma classe assim é difícil de testar — testar um método requer configurar o ambiente para todos os outros. Mudar uma responsabilidade pode quebrar outra, tornando o código frágil.

Na prática, o SRP ajuda os desenvolvedores a responder à pergunta “onde está este código?” Se cada responsabilidade estiver em sua própria classe, encontrar o arquivo correto leva segundos. Em um projeto Android com arquitetura MVVM, isso significa que UserViewModel é responsável apenas pelo estado da tela do usuário, e UserRepository pela obtenção de dados. Um desenvolvedor procurando lógica de cache vai para UserCacheRepository, não para ViewModel. Tal organização de código acelera a integração de novos membros da equipe e reduz o número de erros durante a refatoração.

Por que SRP é importante no desenvolvimento mobile

O desenvolvimento mobile exige especial modularidade do código. Um Fragment Android ou ViewController iOS frequentemente se torna um “ímã” de lógica: tratamento de toques, chamadas de API, análise de respostas, atualização de UI — tudo em uma classe. O SRP exige separar essas responsabilidades.

Na arquitetura Android, o SRP está incorporado nas recomendações do Google sobre Jetpack: ViewModel é responsável pelo estado da tela, Repository pelos dados, UseCase pela lógica de negócio. Cada componente tem um motivo para mudar. No desenvolvimento iOS, os padrões MVVM e Coordinator seguem a mesma lógica.

Seguir o SRP em projetos mobile traz benefícios mensuráveis: redução de 40-60% no tamanho das classes, menos tempo em revisões de código e menos erros de regressão ao adicionar novas funcionalidades. Módulos isolados são mais fáceis de cobrir com testes unitários e reutilizar em outras telas.

Impacto do SRP nos testes

Os testes unitários de classes que seguem o SRP exigem menos objetos mock e menos configuração. Se uma classe tem uma única responsabilidade, suas dependências são limitadas. O teste verifica um comportamento, não uma combinação de vários cenários não relacionados.

De acordo com o relatório do Google Testing Blog (2023), classes com responsabilidade única mostram 35% mais cobertura de testes em comparação com classes agregadoras. Os desenvolvedores escrevem mais facilmente testes para módulos pequenos e compreensíveis.

Exemplos de SRP em Android e iOS

Vejamos uma classe Android típica que viola o SRP — ela carrega dados, analisa a resposta e atualiza a UI. Após a refatoração, cada responsabilidade é separada em seu próprio componente.

kotlin
// Violação de SRP: uma classe faz tudo
class BadUserProfileActivity {
    fun loadUser(userId: Int) {
        // Requisição HTTP
        // Análise JSON
        // Atualização de UI
        // Salvar no BD
    }
}

// Após aplicar SRP
class UserRepository {
    fun getUser(userId: Int): User
}

class UserViewModel {
    private val repo: UserRepository
    fun loadUser(userId: Int) { }
}

class UserProfileFragment {
    fun render(user: User) { }
}

Um exemplo semelhante em iOS Swift com separação da camada de rede e exibição:

swift
// Violação de SRP: ViewController gerencia dados e UI
class BadProfileViewController: UIViewController {
    func viewDidLoad() {
        // Requisição URLSession
        // Decodificar JSON
        // Atualizar label
    }
}

// Após aplicar SRP
protocol UserServiceProtocol {
    func fetchUser(id: Int) async throws -> User
}

class ProfileViewModel {
    private let service: UserServiceProtocol
    func loadProfile(id: Int) { }
}

class ProfileViewController: UIViewController {
    func display(user: User) { }
}

A refatoração SRP não complica a arquitetura — ela redistribui a responsabilidade. A quantidade de código pode até diminuir ao eliminar duplicações. Cada nova classe tem um propósito claro e pode ser desenvolvida independentemente.

Composição como alternativa à herança

A composição ajuda a manter o SRP onde a herança cria acoplamentos desnecessários. Em vez de uma superclasse com dezenas de métodos, a subclasse recebe um conjunto de objetos especializados através do construtor. Cada objeto é responsável por sua própria funcionalidade.

No desenvolvimento Android, o padrão Decorator permite adicionar responsabilidades sem modificar a classe original. No iOS, uma cadeia de Middleware na camada de rede separa logging, cache e autenticação em módulos independentes.

Violações típicas de SRP e suas consequências

A violação mais comum é uma “God Class”: uma classe que gerencia o banco de dados, envia notificações, gera relatórios e processa a entrada do usuário. Essa classe torna-se um gargalo do projeto: qualquer alteração exige testes de regressão completos.

No desenvolvimento mobile, a violação do SRP surge ao misturar lógica de negócio e lógica de UI em Activity, Fragment ou ViewController. Quando um onClickListener simultaneamente valida dados, chama a API e atualiza a visibilidade dos botões — isso é uma violação direta do princípio da responsabilidade única.

As consequências de violar o SRP incluem: dificuldade de desenvolvimento paralelo (conflitos em um único arquivo), testes unitários dificultados, alto custo de modificações e menor legibilidade do código. Projetos com violações sistemáticas de SRP exigem 2-3 vezes mais tempo para adicionar novas funcionalidades.

Indicadores de violação de SRP no código

Podem-se identificar violações de SRP por sinais indiretos: a classe excede 200 linhas, importa módulos de diferentes camadas da aplicação (UI + network + database), tem mais de 5 métodos públicos de diferentes temas. A métrica de coesão é um indicador estatístico: baixa coesão dos métodos dentro de uma classe indica violação de SRP.

Para detectar violações de SRP, utilize ferramentas de análise estática: para Android — Detekt com a regra TooManyFunctions, para iOS — SwiftLint com a regra file_length. Essas utilidades destacam as classes que excedem os limites de tamanho e complexidade.

A refatoração de classes que violam o SRP é feita através de Extract Class ou Extract Delegate: um grupo de métodos relacionados é extraído para uma classe separada e a classe original delega chamadas a eles. A aplicação gradual dessas refatorações transforma uma “God Class” em um conjunto de módulos fracamente acoplados, cada um com uma única responsabilidade. Esta abordagem permite melhorar a arquitetura sem parar o desenvolvimento — a refatoração é feita iterativamente, um módulo de cada vez.

Perguntas frequentes

SRP significa que uma classe deve conter apenas um método?

Não. SRP não é sobre o número de métodos, mas sobre o número de motivos para mudar. Uma classe pode ter dezenas de métodos se todos servirem a uma única responsabilidade perante um único ator. Um único método é o extremo oposto, que leva a uma fragmentação excessiva do código.

Como SRP difere do princípio da obrigação única?

É o mesmo princípio. Single Responsibility Principle é traduzido tanto como “responsabilidade única” quanto como “obrigação única”. O termo “responsabilidade” reflete melhor a essência: trata-se da responsabilidade perante um ator, não de uma função técnica.

Como SRP se relaciona com o padrão Repository?

Repository é um resultado direto da aplicação do SRP à camada de dados. Em vez de espalhar a lógica de acesso a dados por ViewModel ou UseCase, Repository assume uma única responsabilidade: fornecer dados com abstração da fonte. É uma implementação clássica de SRP na arquitetura mobile.

Uma classe com SRP pode ter dependências de outras classes?

Sim, SRP não proíbe dependências. Uma classe com uma única responsabilidade pode delegar parte do trabalho a outras classes através de composição. O importante é que essas tarefas delegadas sejam parte da mesma responsabilidade, não um motivo independente para mudar.

Como verificar se uma classe segue o SRP?

Faça a pergunta: “Quais atores poderiam solicitar mudanças nesta classe?” Se a resposta incluir mais de um ator, o SRP foi violado. Adicionalmente: tente descrever o propósito da classe em uma única frase sem a conjunção “e”. Se não conseguir, a classe faz demais.

Resumo

  • SRP (Single Responsibility Principle) — o primeiro princípio SOLID, exigindo um motivo para uma classe mudar
  • O motivo da mudança é determinado por um ator — pessoa ou sistema que inicia um requisito para o módulo
  • Violar SRP leva a God Class, baixa testabilidade e altos custos de modificação
  • No desenvolvimento mobile SRP separa lógica de UI, lógica de negócio e manipulação de dados em componentes independentes
  • A composição ajuda a manter SRP melhor que a herança, delegando a objetos especializados
  • Ferramentas de análise estática (Detekt, SwiftLint) detectam automaticamente possíveis violações de SRP
  • Testes unitários de classes com SRP exigem menos objetos mock e mostram maior cobertura de código

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também