0

int をローマン文字列に変換する関数があるとします。

public String roman(int)

1 から 3999 までの数値のみが変換に有効です。

OO 言語で誰かが 4000 を超えた場合、あなたはどうしますか?

  1. 例外を発生させる
  2. 「」またはその他の特別な文字列を返す
  3. アサートを書く
  4. …</li>
4

2 に答える 2

1

1: 例外を発生させます。それArgumentOutOfRangeExceptionが目的です(少なくとも.NETでは):

if (intToConvert >= 4000)
{
    throw new ArgumentOutOfRangeException("intToConvert ", "Only numbers 1-3000 are valid for conversion.");
}
于 2012-12-19T01:28:54.457 に答える
1

一般的に、検証のトピックは非常に興味深いと思います。私の意見では、オプション 2 (特別な値を返す) は良いものではありません。なぜなら、返された値をチェックするためにクライアントに if/case を実行させ、そのコードをどこでも繰り返さなければならないからです。また、呼び出しスタックを介して伝播する例外とは異なり、このシナリオでは、ほとんどの場合、呼び出し元がその特別な値を処理する必要があります。

OOPのコンテキストでは、例外を発生させたりアサーションを持ったりすることは、IMOであり、それに対処するためのよりエレガントな方法です。ただし、すべてのメソッドで検証コードをインライン化すると、いくつかの理由でうまくスケーリングされないことがわかりました。

  • 多くの場合、検証ロジックはメソッド ロジック自体よりも大きくなってしまうため、完全には関係のないものでコードが雑然としてしまいます。
  • 適切な検証コードの再利用はありません (例: 範囲の検証、電子メールの検証など)。
  • これはあなたの好みにもよりますが、防御的プログラミングを行うことになります。

数年前、私はバリデーターに関する講演に参加しました (同様の講演スライドはこちらにあります。それを説明する文書は以前はhttp://www.caesarsystems.com/resources/caesarsystems/files/Extreme_Validation.pdfにありましたが、現在は 404 :( ) そしてコンセプトが完全に好きです. オブジェクト指向の哲学を採用した検証フレームワークを持つ私見は行くべき道です. あなたがそれについて読みたい場合のために, 私はそれについてここここにいくつかの投稿を書きました(免責事項:投稿は、私が働いている会社のブログの一部です)。

HTH

于 2012-12-19T12:40:52.673 に答える