Início > Qualidade de Código > Princípio da Responsabilidade Única (SRP)

Princípio da Responsabilidade Única (SRP)

Como já tinha falado no post sobre Princípios S.O.L.I.D., o Princípio da Responsabilidade Única (SRP) estabelece que uma classe, método ou variável deve fazer apenas uma coisa e deve ter apenas uma razão para mudar. Esse talvez seja o princípio mais fundamental no desenvolvimento de um código limpo. Todos os outros princípios se baseam nele ou estão sobre ele fundamentados.

Vamos mostrar como utilizar esse princípio. Antes disso, contudo, veja o exemplo de classe abaixo (que não respeita o SRP).

public class Controlador
{
	public List<Conta> contas;
	public List<Cliente> clientes;

	public void DepositarQuantiaEmConta(Guid contaId, double quantia)
	{...}

	public void SacarQuantiaEmConta(Guid contaId, double quantia)
	{...}

	public Conta ProcurarContaPeloId(Guid contaId)
	{...}

	public void CriarNovaConta(Cliente cliente)
	{...}

	public void ExcluirConta(Guid contaId)
	{...}

	public void TransferirQuantia(Conta contaOrigem, Conta contaDestino)
	{...}

	public void CadastrarCliente(Cliente cliente)
	{...}

	public void ExcluirCliente(long clienteId)
	{...}

	public void ProcurarClientePeloNome(string nomeCliente)
	{...}
}

É fácil notar que a classe tem mais de uma responsabilidade. Ela trada de operações independentes relacionadas com as entidades Cliente e Conta. O próprio nome da classe não deixa claro a sua funcionalidade.

Ao ver o nome da classe não sabemos inicialmente ao que ela se refere. “Controlador de quê?” É a primeira pergunta que fazemos. É melhor evitar esses nomes extremamente genéricos. Defina bem o nome e certamente será mais fácil delegar apenas uma responsabilidade.

Além disso, a maioria dos códigos que não respeitam o SRP recaem sobre o antipadrão The Blob. Antipadrão? O que é isso!?

Antipadrões

Um Antipadrão de Desenvolvimento de Software descreve uma má prática que torna o código ruim, ilegível ou difícil de manter (e de ser alterado). Antipadrões (Antipatterns) são a contra-parte dos Padrões de Projeto (Design Patterns).

the blob imageO código acima está fortemente similar ao antipadrão The Blob. Isso porque temos uma única classe que controla todo o sistema. Essa “Classe-Monstro” engloba toas as reponsabilidades (e ações) que do sistema. Dessa forma, caso seja necessário adicionar mais uma funcionalidade ao código, a classe vai aumentar ainda mais e em alguns meses teremos uma “Mega Classe” que será bastante difícil de encontrar, alterar ou remover qualquer coisa. Mesmo se essa coisa for simples!

Aplicando o SRP

Para tornar nosso código mais limpo, vamos aplicar o conceito definido pelo SRP. Para isso, vamos extrair cada responsabilidade da nossa “Classe-Monstro” em várias classes pequenas que comportem cada uma delas. As pequenas classes devem  fazer apenas uma coisa, respeitanto o SRP.

Responsável pelas operações sobre a entidade Cliente:

public class RepositorioCliente
{
	public void CadastrarCliente(Cliente cliente)
	{...}

	public void CadastrarCliente(Cliente cliente)
	{...}

	public void ExcluirCliente(long clienteId)
	{...}

	public void ProcurarClientePeloNome(string nomeCliente)
	{...}
}

Classe responsável pelas operações sobre a entidade Conta:

public class RepositorioConta
{
	public Conta ProcurarContaPeloId(Guid contaId)
	{...}

	public void CriarNovaConta(Cliente cliente)
	{...}

	public void ExcluirConta(Guid contaId)
	{...}
}

A entidade Conta engloba as operações de Sacar e Depositar quantia:

public class Conta
{
	private Guid id;
	private double saldo;

	public void Depositar(double quantia)
	{...}

	public void Sacar(double quantia)
	{...}
}

Não faz muito sentido inserir a operação de transferência de quantia na classe Conta. Ela se encaixa melhor em uma entidade separada, dedicada exclusivamente a ela.

public class ContaService
{
	public void TransferirQuantia(Conta contaOrigem, Conta contaDestino)
	{...}
}

Note que o código ficou mais simples de ser entendido. E agora, caso seja necessário alterar alguma funcionalidade, modificaremos apenas a classe que a engloba, sem alterarmos todo o código. O sistema ficou mais extensível e menos emaranhado.

Até o próximo post.

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: