我试图尽可能地遵守单一职责原则(SRP),并且习惯了某种严重依赖委托的特定模式(对于方法上的SRP)。我想知道这种方法是否合理,或者是否存在严重问题。
例如,要检查对构造函数的输入,我可以引入以下方法(Stream输入是随机的,可以是任何东西)
private void CheckInput(Stream stream)
{
    if(stream == null)
    {
        throw new ArgumentNullException();
    }
    if(!stream.CanWrite)
    {
        throw new ArgumentException();
    }
}
这种方法(可以说)做的不止一件事
- 检查输入
- 引发不同的异常
因此,为了遵守SRP,我将逻辑更改为
private void CheckInput(Stream stream, 
                        params (Predicate<Stream> predicate, Action action)[] inputCheckers)
{
    foreach(var inputChecker in inputCheckers)
    {
        if(inputChecker.predicate(stream))
        {
            inputChecker.action();
        }
    }
}
据说哪件事只会做一件事(是吗?):检查输入。对于输入的实际检查和异常的抛出,我介绍了类似的方法
bool StreamIsNull(Stream s)
{
    return s == null;
}
bool StreamIsReadonly(Stream s)
{
    return !s.CanWrite;
}
void Throw<TException>() where TException : Exception, new()
{
    throw new TException();
}
并可以CheckInput像
CheckInput(stream,
    (this.StreamIsNull, this.Throw<ArgumentNullException>),
    (this.StreamIsReadonly, this.Throw<ArgumentException>))
这是否比第一种选择更好,还是我引入了不必要的复杂性?如果可行的话,还有什么办法可以改善这种模式?


CheckInput仍然在做很多事情:它既遍历数组,又调用谓词函数,又调用了动作函数。那是否不违反SRP?