Estou tentando aderir ao Princípio da Responsabilidade Única (SRP), tanto quanto possível, e me acostumei a um certo padrão (para o SRP de métodos), confiando fortemente nos delegados. Gostaria de saber se essa abordagem é sólida ou se há algum problema grave.
Por exemplo, para verificar a entrada de um construtor, eu poderia introduzir o seguinte método (a Stream
entrada é aleatória, pode ser qualquer coisa)
private void CheckInput(Stream stream)
{
if(stream == null)
{
throw new ArgumentNullException();
}
if(!stream.CanWrite)
{
throw new ArgumentException();
}
}
Esse método (sem dúvida) faz mais de uma coisa
- Verifique as entradas
- Lance exceções diferentes
Para aderir ao SRP, mudei a lógica para
private void CheckInput(Stream stream,
params (Predicate<Stream> predicate, Action action)[] inputCheckers)
{
foreach(var inputChecker in inputCheckers)
{
if(inputChecker.predicate(stream))
{
inputChecker.action();
}
}
}
O que supostamente faz apenas uma coisa (faz?): Verifique a entrada. Para a verificação real das entradas e o lançamento das exceções, introduzi métodos como
bool StreamIsNull(Stream s)
{
return s == null;
}
bool StreamIsReadonly(Stream s)
{
return !s.CanWrite;
}
void Throw<TException>() where TException : Exception, new()
{
throw new TException();
}
e pode ligar CheckInput
como
CheckInput(stream,
(this.StreamIsNull, this.Throw<ArgumentNullException>),
(this.StreamIsReadonly, this.Throw<ArgumentException>))
Isso é melhor do que a primeira opção, ou introduzo complexidade desnecessária? Existe alguma maneira de eu ainda melhorar esse padrão, se é viável?
CheckInput
ainda está fazendo várias coisas: ele está repetindo uma matriz e chamando uma função predicada e chamando uma função de ação. Isso não é uma violação do SRP?