2011-02-09 5 views
0

かなり短く簡単な質問です。C++/CLI優れたコーディング慣行、インデックス付きプロパティif-checkまたはtry..catch?

のは、コードのこの部分を使用してみましょう:

public ref class Foo 
{ 
private: 
    System::Collections::Generic::Dictionary<System::String ^,System::String ^>^aDictionary; 

public: 

    property System::String^SomeIndexedProperty[System::String ^] 
    { 
    public: System::String^get(System::String^index) 
      { 
       return aDictionary[index]; 
      } 
    } 

public: 
    Foo(void) 
    { 
     aDictionary = gcnew System::Collections::Generic::Dictionary<System::String ^,System::String ^>(); 
    } 
}; 

if(aDictionary->ContainsKey(index))(if文で/事前チェックのリターンを囲むように良いだろうか、試してみるとreturn文を囲むように良いだろう。 .catchブロック?彼らは失敗したときに、両方のケースで

はnullptrを返す。

スピードは本当に問題のではありません。しかし、単に一般的な十分であろう「これがその理由のために優れている」。

+0

nullptrを返すことは、大部分のケースでは間違ったことです。 HasValue()メソッドを追加して、値が存在しないことをクライアントコードが検出できるようにします。値が常に存在するように使用方法が指示している場合は、クライアントプログラマがバグを簡単に修正できるように何もしないでください。 –

答えて

2

合理的に許可されている法的条件がある場合、それを検出するために例外を検出すべきではないと確信しています。つまり、ifステートメントを使用します。これは、あなたがArrayIndexOfBoundsExceptionになるまで配列のすべてのループを使い果たし、それを忘却に捕まえようとするのと同じです。

関連するノートでは、nullを返すのではなく、プロパティがKeyNotFoundExceptionをスローすることが考えられます。呼び出し側はこれをnullとし、逆参照しようとすると、フォーカスを移動してバグを見つけにくくなります。

+0

私は同意しますが、例外は例外的な状況であり、日常の障害ではありません。 – Massif

+0

+1。例外を伝播させて、クライアントに 'KeyNotFoundException'をキャッチさせます。これはあなたとクライアントの両方にとってより明確で簡単です。 –

+0

ええ、あなたの先生のための小さな宿題で、これは正しい答えです。 try..catchブロックを残して、メソッドの名前を "TryGet()"に変更して、純粋主義者を満足させる;) – BertuPG

1

あなたの状況を説明すると、あなたの好みにのみ依存すると思います。 とにかく、失敗条件が確定的で、予期できる場合は、try..catchブロックを使用しない方が良い解決策であり、非確定的なエラーと予測できないエラーの場合にのみ残してください。

"if"ブロックの代わりに例外に対するすべての議論は、パフォーマンス(スピード、メモリ、スタック、eccなど)についてのみであり、accademicです。本当の意味では、完全に例外を除いたメソッドが必要で、戻り値がnullの理由を気にしない場合は、5行をtry..catchブロックにして忘れてください! ;)

関連する問題