0

以下はC#ですが、コードパターンはおそらくすべてのオブジェクト指向言語に関連しています。

私には、MethodWithTryとMethodWithSomeReturnValueの2つのメソッドがあり、機能的には同等であると信じています。それらの1つが「正しい」方法であるかどうかを知りたいです。それらの1つを悪い選択にする1つ(例:並行性)について何かありますか?

    public void MethodWithTry()
    {
        int returnValue;
        string someInput;

        if (TryGetValueThisWay(someInput, returnValue))
        {
            //do something this way
        }
        else
        {
            if (TryGetValueThatWay(someInput, returnValue))
            {
                //do something that way
            }
            else
            {
                //do something a default way
            }
        }
    }

    public void MethodWithSomeReturnValue()
    {
        int? returnValue;
        string someInput;

        returnValue = GetValueThisWay(someInput);
        if (returnValue != null)
        {
            //do something this way
        }
        else
        {
            returnValue = GetValueThatWay(someInput);
            if (returnValue != null)
            {
                //do something that way
            }
            else
            {
                //do something a default way
            }
        }
    }

呼び出されるメソッドのシグネチャは次のとおりです。

    public int? GetValueThisWay(string input)
    public int? GetValueThatWay(string input)
    private bool TryGetValueThisWay(string input, out int value)
    private bool TryGetValueThatWay(string input, out int value)

編集-追加情報

呼び出されている問題のメソッドは、コレクションで検索を実行しています。だから別の名前があったかもしれない

public int? GetValueFromCollectionA()
public int? GetValueFromCollectionB()

IMHO、TrySomeMethodName-コードをいくらか読みやすくします。ただし、特に戻り値が整数の場合にOUT変数を使用すると、常に可変であり、少なくとも2回割り当てられます(デフォルトでは0に設定されます)。

4

3 に答える 3

0

今日このメソッドを記述している戻り値のタイプに応じて(操作が失敗する可能性があり、それがワークフロー全体の一部であると仮定して)、null許容構造体またはアプローチnullの代わりに参照値を返します-値を使用する必要があるのはかなり面倒です私の意見。Tryxxxout

 public int? MethodWithSomeReturnValue()
 {
    //return null in failure case
 }

 int? result = MethodWithSomeReturnValue();
 if(result != null)
 {
   //...
 }
于 2012-05-16T19:35:47.193 に答える
0

まあ、それは異なります。そして、おそらくこれはあなたがあなたに答える意志を持って皆から得る答えになるでしょう。値が常に何らかのタイプからのものであり、GetValueまたはConvertToInt32(たとえば)を使用できることを知っているか、または想定できる場合があります。たとえば、定義されたタイプのデータベースから値を取得します。ただし、ユーザー入力のように、入力を信頼できず、どのタイプであるかわからない場合もあります。この場合、TryGetValueまたはTryParse(例)を使用することをお勧めします。結局、それはあなた次第です。

于 2012-05-16T19:36:35.337 に答える
0

値型(などint)を操作し、メソッドの結果がになる可能性がnullある場合は、Tryバージョンを選択する必要があります。これは、値型が。とうまく混ざらないためですnull。たとえば、によって導入されたボクシングの場合よりもはるかにint?遅くなります。すべての.NETメソッドは値型で機能し、このパターンに従います。このアプローチに従うのは良いことだと思います。int?TryParse

参照型の操作を開始すると、メソッドresultを使用して、必要に応じて戻ることがより自然になりnullます。

于 2012-05-16T20:07:42.453 に答える