私は可能な限り単一責任原則(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();
}
}
}
たぶん1つのことだけを行う(行うのか?):入力を確認する。入力の実際のチェックと例外のスローのために、次のようなメソッドを導入しました
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の違反ではありませんか?