いくつかの調査を行うと、パブリック メソッドへの引数は検証されるべきであるが、プライベート関数は通常検証されないことに、人々は一般的に同意しているようです。これにより、いくつかの疑問が生じますが、これまでのところ満足のいく答えを見つけることができませんでした.
例:
public void DoSomething(int i)
{
if (i < 0)
throw new ArgumentOutOfRangeException("i");
double d = DoWork(i);
}
private double DoWork(int i)
{
double ret = ...; // some calculation
return ret;
}
考え:
i
内部で非負であるという要件が変更された場合はどうなりますDoWork()
か? この設計は、時代遅れの検証チェックを残すリスクがあります。プログラマーは、変更された関数の使用法を調整する責任がありますが、エラーのリスクを最小限に抑えるためのより良い方法があるかどうか疑問に思っています。DoWork()
not からの異なる呼び出しはどうDoSomething()
ですか? 引数を重複して検証する必要がありますか?
public void DoSomething(int i)
{
if (i < 0)
throw new ArgumentOutOfRangeException("i");
double d = DoWork(i);
}
public void DoSomethingElse()
{
int i = 5;
if (i < 0)
throw new ArgumentOutOfRangeException("i");
double d = DoWork(i);
}
private double DoWork(int i)
{
double ret = ...; // some calculation
return ret;
}
これは、チェックを独自の関数に入れることで少しきれいにすることができます。次に、 を呼び出す新しい関数がDoWork(int i)
を検証するのを忘れるリスクがありi
ます。
public void DoSomething(int i)
{
ThrowIfIntegerIsNegative(i);
double d = DoWork(i);
}
public void DoSomethingElse()
{
int i = 5;
ThrowIfIntegerIsNegative(i);
double d = DoWork(i);
}
static void ThrowIfIntegerIsNegative(int i)
{
if (i < 0)
throw new ArgumentOutOfRangeException("i");
}
private double DoWork(int i)
{
double ret = ...; // some calculation
return ret;
}
それはこれよりも優れていますか?
public void DoSomething(int i)
{
double d = DoWork(i);
}
public void DoSomethingElse()
{
double d = DoWork(5);
}
private double DoWork(int i)
{
if (i < 0)
throw new ArgumentOutOfRangeException("i");
double ret = ...; // some calculation
return ret;
}
状況に応じて、これらは私が同時に達成しようとしているいくつかの目標です。
- 引数の検証を 1 か所で行います (場合によっては、引数を使用する関数内)。
- 遅かれ早かれエラーを報告します (不適切なユーザー入力のために最後に失敗するためだけに、大量のコードを 1 時間実行したくない場合があります)。
- 引数を複数回検証しない
- リリース コードでのパフォーマンスへの影響を回避する
どのようにバランスを取りますか?どの方法論があなたにとって最も効果的でしたか? 洞察をいただければ幸いです。