O primeiro sinal de desvio é quando a classe têm muitos atributos que não se relacionam entre si. Que não formam uma unidade. Isto costuma ser um sinal de que a classe tem várias responsabilidades diferentes e, por isso, precisa manter estados para cada uma delas.
Outro sinal de desvio é quando a classe têm métodos que não se correlacionam com o conceito da classe no mundo real. Ter alguns métodos utilitários para ajudar na escrita do código, pode ser útil, mas definir a qual classe corresponde o método é essencial para não violar o Princípio da Responsabilidade Única. Por exemplo, poderiamos pensar que não ha mal em colocar um método na classe Rational
que cria um número complexo.
class Rational {
...
Complex toComplex(){
return new Complex(this, 0);
}
...
Este método constroi um objeto Complex
usando o valor da classe Rational
com a parte real. Parece inofensivo, mas a classe Rational
acabou de ganhar a responsabilidade de ser uma fábrica de números complexos. E se o número racional tivesse que ser a parte imaginária? Poderiamos alterar para:
class Rational {
...
Complex toRealComplex(){
return new Complex(this, 0);
}
Complex toImaginaryComplex(){
return new Complex(0, this);
}
...
Poderia pareceer muito evidente e até interligente fazermos esta escolha e design e tornar a classe Rational
uma fábrica de objetos Complex
, mas estariamos violando o Princípio da Responsabilidade Única.
A forma de ver que estamos violando é levar a decisão ao extremo. Decidimo que não faz mal que Rational
seja uma fábrica de objetos Complex
, mas e se tivessmos mais objetos para criar? Teriamos um método para cada um? Claramente não. Então, se não faz sentido para muitos, não faz sentido para um. Não ha exceções. Não ha "mas é só este…".
Seguir o Princípio da Responsabilidade Única nos obrigaria a remover esses métodos dali e chegar num melhor design em que a classe Complex
tem os métodos para criar instancias a partir de Rational
. Sem a trava do Princípio da Responsabilidade Única, não iriamos procurar por outro design melhor. Por isso é importante seguir o Princípio da Responsabilidade Única em todas as classes que constroi.
Rational
é um objeto de valor e pode ser óbvio que um objeto de valor deve ser apenas isso: um valor. Para objetos mais complexos como serviços, repositórios e telas seguir o Princípio da Responsabilidade Única pode não ser tão obvio. Lembre-se que o Princípio da Responsabilidade Única não limita o número de métodos, operações ou atributos na sua classe. Ele limita a responsabilidade da classe.