Questão nº 45
Questão de Tecnologia da Informação · FCC TRE-PR 2017 (nº 45)
Os princípios SOLID reúnem cinco boas práticas para projetos Orientados a Objetos-OO. O princípio S, que se refere ao Single Responsability Principle-SRP ou Princípio de Responsabilidade Única, indica que uma classe deve ter uma e, apenas uma, razão para mudar. Considere a classe Java abaixo.
```
public class UrnaEleitoral {
public void AdicionarCandidato(String nome, int numero, int partido) { }
public decimal CalcularTotalVotosCandidato() { }
public void CadastrarPartidos() { }
public void CadastrarEleitores() { }
public void CadastrarMesarios() { }
}
```
Com base no princípio SRP e nas boas práticas para projetos OO, é correto afirmar:
- AO SRP visa aumentar o acoplamento entre classes e separar responsabilidades como forma de melhorar o código da aplicação OO sendo desenvolvida.
- BA classe UrnaEleitoral tem acoplamento baixo, ou seja, tem um número pequeno de dependências e, portanto, fica mais sujeita a mudanças em decorrência de alterações em outras classes.
- CUma classe com mais de um motivo para mudar possui mais de uma responsabilidade e apresentando dificuldade de manutenção, mas, por outro lado, tem maior facilidade de reúso e de coesão.
- DA classe UrnaEleitoral apresenta uma quebra do SRP, uma vez que possui responsabilidades que deveriam ser de componentes distintos do software. (alternativa correta)
- EEm um projeto com várias classes seguindo o padrão da classe UrnaEleitoral fica mais fácil manter a coesão em um nível mais alto ou em nível de componentes, pois o software fica com uma divisão clara de camadas.
Resposta comentada
Gabarito Alternativa D
O Princípio da Responsabilidade Única (SRP) afirma que uma classe deve ter apenas um motivo para mudar, ou seja, ela deve ser responsável por uma única funcionalidade específica do sistema. Isso ajuda a manter o código organizado e fácil de manter.
(A) Incorreta: O SRP visa diminuir o acoplamento (dependência entre classes) e aumentar a coesão (quão bem os elementos de uma classe se relacionam entre si), não aumentar o acoplamento. A armadilha aqui é que a segunda parte da frase ("separar responsabilidades como forma de melhorar o código") é verdadeira para o SRP, mas a primeira parte ("aumentar o acoplamento") a torna totalmente incorreta.
(B) Incorreta: Uma classe com muitas responsabilidades, como a `UrnaEleitoral` apresentada, tende a ter alto acoplamento (muitas dependências e pontos de contato) e baixa coesão, tornando-a mais sujeita a mudanças e mais difícil de manter, não menos.
(C) Incorreta: Uma classe com mais de um motivo para mudar (violando o SRP) realmente apresenta dificuldade de manutenção e tem baixa coesão. No entanto, ela tem menor facilidade de reúso, pois ao tentar reutilizar uma de suas funcionalidades, você arrasta consigo outras funcionalidades que podem não ser necessárias. A armadilha aqui é que a primeira parte da frase está correta (dificuldade de manutenção), mas a segunda parte ("maior facilidade de reúso e de coesão") é o oposto do que acontece.
(D) Correta: A classe `UrnaEleitoral` possui diversas responsabilidades distintas (gerenciar candidatos, calcular votos, cadastrar partidos, eleitores e mesários). Cada uma dessas responsabilidades representa um motivo diferente para a classe mudar. Pelo SRP, cada uma delas deveria ser encapsulada em classes separadas, como, por exemplo, `GerenciadorDeCandidatos`, `ApuradorDeVotos`, `GerenciadorDePartidos`, etc.
(E) Incorreta: Classes que violam o SRP, como a `UrnaEleitoral`, resultam em baixa coesão e dificultam a manutenção e a divisão clara de camadas, pois misturam diferentes preocupações em um único componente.
Fonte: FCC TRE-PR 2017 Técnico Judiciário - Área Apoio Especializado - Especialidade Programação de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.