2012-03-21 4 views
4

私はFoo()メソッドをいくつか苦労していますが、UIレイヤにはそのメソッドを呼び出すボタンがあります。
Foo()メソッドに問題がある場合、メソッドを呼び出してメッセージボックスを表示するだけです。例外()をスローするのではなく、タプル<bool、string>を返しますか?

Iは、メソッドのシグネチャを設計するための2つの選択肢があり

1.Tuple

Tuple<bool, string> Foo() 
{ 
    if(!DoHardWorkA()) return Tuple.New(false, "cannot do hardwork A"); 
    if(!DoHardWorkB()) return Tuple.New(false, "cannot do hardwork B"); 

    return Tuple.New(true, String.Empty); 
} 

2.Exception

void Foo() 
{ 
    if(!DoHardWorkA()) throw new ProgramSpecificException("cannot do hardwork A"); 
    if(!DoHardWorkB()) throw new ProgramSpecificException("cannot do hardwork B"); 

    return Tuple.New(true, String.Empty); 
} 

両方DoHardWorkA()とDoHardWorkB()は、外部のメソッドであります私はそれらのコントロールを持っておらず、結果を示すtrue/falseを返します。

論理的には、実際の例外であるため、オプション2を使用する必要があります。しかし一貫性のために、私はオプション1に行きたいと思っています。

あなたはどれを好きですか、なぜですか?

+0

で行くと思います。このC#のですか?あなたはあなたの質問にあなたが使っている言語でタグを付けるべきです。 – asawyer

+6

重要な質問は次のとおりです:*例外的に非常にまれな、または共通ですか?*例外的に稀な場合は例外をスローしてから処理します*。障害が一般的である場合は、*障害の性質を報告するデータを返し、そのデータを他のデータと同様に処理します。 –

答えて

2

例外をスローし、一貫性のある方法で処理するほうが優れています。

Fooが他の理由で失敗した場合は、Fooも処理されます。シナリオを考えてみましょう。

void UIMethod() 
{ 
    Tuple<Result, Error> ret = Foo(); 
    if(ret.Error) 
    MessageBox.Show(ret.Error); 
} 

要件が変更されたため、Fooより前に別のメソッドを呼び出す必要があり、例外をスローすることもできます。それは複雑になります。

これははるかに簡単です。

void UIMethod() 
{ 
    try{ 
     MethodBeforeFoo(); 
     var ret = Foo(); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

} 
0

成功した場合はnull、失敗した場合はエラーメッセージが返されました。障害がありそうだったし、他の開発者は、例外を使用し

String Foo() 
{ 
    if(!DoHardWorkA()) return "cannot do hardwork A"; 
    if(!DoHardWorkB()) return "cannot do hardwork B"; 

    return null; 
} 
0

は、あなたが潜在的に(*)を提案したタプルよりも簡単な理由から区別できるadvnatageを持っている「例外がスローされたときにブレーク」を使用して実行するように好きなように例外が不適切でした戻り値タプルを使用するときにどのようなことが間違っているのか把握するには、エラーが発生しやすい文字列値を解釈する必要があります。例外を使用すると、例外の種類に基づいてエラーの種類を判断できます。

(*)は、例外が使用されている方法によって異なります - あなたは、一般的な例外のすべての時間を投げている場合、それは違うではありませんあなたは示すために、タプルに整数を使用することができますもちろん

エラータイプの数値はExceptionタイプと同じくらい記述的ではありません(Exceptionのような一般的なタイプを使用していないと仮定します)。

1

本当に必要に応じています。このようにコードを修正すると、未処理の例外も処理されます。

Tuple<bool, string> Foo() 
{ 
try 
{ 
    if(!DoHardWorkA()) return Tuple.New(false, "cannot do hardwork A"); 
    if(!DoHardWorkB()) return Tuple.New(false, "cannot do hardwork B"); 

    return Tuple.New(true, String.Empty); 
} 
catch 
{ 
    return Tuple.New(false, "cannot do hardwork A"); 
} 

}

2

あなたがやっているすべては、これらの外部の方法はいくつかの作業を行うために呼び出している、とあなたが書いている。この方法は、それらのラッパーである場合に例外をスローする理由、そして、問題の「ハンドル」あなたの方法では、例外をスローする多くの多くの回より高価です。あなたの特定のケースで

、あなたがやっているすべては、いくつかの仕事をして、それが適切に実行するかどうかを表示するメッセージボックスを表示するので、私はオプション1

関連する問題