int をローマン文字列に変換する関数があるとします。
public String roman(int)
1 から 3999 までの数値のみが変換に有効です。
OO 言語で誰かが 4000 を超えた場合、あなたはどうしますか?
- 例外を発生させる
- 「」またはその他の特別な文字列を返す
- アサートを書く
- …</li>
int をローマン文字列に変換する関数があるとします。
public String roman(int)
1 から 3999 までの数値のみが変換に有効です。
OO 言語で誰かが 4000 を超えた場合、あなたはどうしますか?
1: 例外を発生させます。それArgumentOutOfRangeException
が目的です(少なくとも.NETでは):
if (intToConvert >= 4000)
{
throw new ArgumentOutOfRangeException("intToConvert ", "Only numbers 1-3000 are valid for conversion.");
}
一般的に、検証のトピックは非常に興味深いと思います。私の意見では、オプション 2 (特別な値を返す) は良いものではありません。なぜなら、返された値をチェックするためにクライアントに if/case を実行させ、そのコードをどこでも繰り返さなければならないからです。また、呼び出しスタックを介して伝播する例外とは異なり、このシナリオでは、ほとんどの場合、呼び出し元がその特別な値を処理する必要があります。
OOPのコンテキストでは、例外を発生させたりアサーションを持ったりすることは、IMOであり、それに対処するためのよりエレガントな方法です。ただし、すべてのメソッドで検証コードをインライン化すると、いくつかの理由でうまくスケーリングされないことがわかりました。
数年前、私はバリデーターに関する講演に参加しました (同様の講演スライドはこちらにあります。それを説明する文書は以前はhttp://www.caesarsystems.com/resources/caesarsystems/files/Extreme_Validation.pdfにありましたが、現在は 404 :( ) そしてコンセプトが完全に好きです. オブジェクト指向の哲学を採用した検証フレームワークを持つ私見は行くべき道です. あなたがそれについて読みたい場合のために, 私はそれについてこことここにいくつかの投稿を書きました(免責事項:投稿は、私が働いている会社のブログの一部です)。
HTH