C#構文-メソッドから2つまたは3つの回答を取得するための推奨プラクティス

StackOverflow https://stackoverflow.com/questions/337925

質問

他の開発者が、メソッドから2つまたは3つの回答を得るというこの問題にどのように取り組んでいるか疑問に思っています。

1)オブジェクトを返す[]
2)カスタムクラスを返す
3)複数の変数でoutまたはrefキーワードを使用する
4)単純なTuple <!> lt; <!> gt;を作成または借用(F#)しますジェネリッククラス
http://slideguitarist.blogspot.com/2008/02/whats- f-tuple.html

現在、データの更新を行ういくつかのコードに取り組んでいます。更新を行うメソッドから、(1)更新開始時間と(2)更新終了時間を返します。
後日、3番目の値を返したい場合があります。

考え?このトピックに関するオープンソースの.NETプロジェクトの良い習慣はありますか?

役に立ちましたか?

解決

あなたの質問は、将来さらに多くのデータを返す可能性を指しているので、データを含めるために独自のクラスを実装することをお勧めします。

これが意味することは、渡すオブジェクトの内部表現が変更され、より多くのデータを収容しても、メソッドのシグネチャは同じままであることです。また、読みやすさとカプセル化の理由からも良い習慣です。

他のヒント

結果が何であるかに完全に依存します。それらが互いに関連している場合、通常、カスタムクラスを作成します。

それらが実際に関連していない場合は、outパラメーターを使用するか、メソッドを分割します。メソッドが関係のない3つのアイテムを返したい場合は、おそらくやり過ぎです。これの例外は、Webサービスの境界または<!> quot; purer <!> quot; APIがおしゃべりすぎる可能性があります。

2つの場合、通常4)

それ以上、2)

コードアーキテクチャでは、特定の量の変数を変更する必要がある場合は常にカスタムクラスを使用します。どうして?クラスが実際には<!> quot; blueprint <!> quot;であるためです。よく使用されるデータ型で、独自のデータ型を作成します。この場合は、適切な構造を取得し、他のインターフェイスのプログラムを支援します。

個人的には、パラメータのout / refが嫌いなので、そのアプローチは使いたくありません。また、ほとんどの場合、複数の結果を返す必要がある場合、おそらく何か間違ったことをしていることになります。

本当に避けられない場合は、おそらく長期的にカスタムクラスを作成するのが一番幸せでしょう。配列を返すことは簡単で効果的であるため魅力的ですが、クラスを使用すると、下流で問題を引き起こすことを心配することなく、将来的に戻り値の型を変更するオプションが提供されます。返された配列内の2つの要素の順序を入れ替えると、デバッグの悪夢の可能性を想像してください。...

追加の変数が1つまたは2つだけの場合は使用します(たとえば、関数は実際の重要な結果であるブール値を返しますが、ロギングの目的で、関数が実行された時間を返すoutパラメーターとしても使用されます) 。

より複雑なものについては、通常、カスタムの構造体/クラスを作成します。

C#プログラマがこれを行う最も一般的な方法は、返されるアイテムを別のクラスにラップすることだと思います。これにより、将来的に最も柔軟性の高いIMHOが提供されます。

状況によります。内部専用APIの場合、通常は最も簡単なオプションを選択します。一般的にそれは出ています。

パブリックAPIの場合、カスタムクラスは通常より意味がありますが、それがかなり原始的なものである場合、または関数の自然な結果がブール値(* .TryParseなど)の場合は、出力パラメーターを使用します。 boolへの暗黙的なキャストを使用してカスタムクラスを実行することもできますが、通常は奇妙です。

特定の状況では、単純な不変のDateRangeクラスが私にとって最も適切なようです。既存のユーザーに影響を与えることなく、その新しい値を簡単に追加できます。

更新の開始時刻と終了時刻を送り返したい場合、おそらくDataRefreshResultsと呼ばれる可能性のあるクラスまたは構造体を提案します。考えられる3番目の値も更新に関連している場合は、追加できます。構造体は常に値で渡されるため、ヒープに割り当てられているため、ガベージコレクションを行う必要はありません。

2つの値にKeyValuePairを使用する人もいます。しかし、2つのものにKeyValueのラベルを付けるだけなので、あまり良くありません。あまり説明的ではありません。また、これを追加すると真剣にメリットがあります:

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Make(K k, V v) 
    { 
        return new KeyValuePair<K, V>(k, v); 
    }
}

タイプを作成するときにタイプを指定する必要がなくなります。ジェネリックメソッドは型を推測できますが、ジェネリッククラスコンストラクターは推測できません。

シナリオでは、一般的なRange {T}クラスを定義する必要があります(範囲の有効性をチェックします)。

メソッドがプライベートの場合、通常はヘルパーライブラリ。一般に、パブリックメソッドまたは保護されたメソッドは常に個別に値します。

カスタムタイプを返しますが、クラスを使用せず、構造体を使用します。メモリ割り当て/ガベージコレクションのオーバーヘッドがないため、マイナス面はありません。

2の場合、ペア。

クラスが2つ以上の場合。

別の解決策は、名前付きオブジェクト参照の辞書を返すことです。私にとって、これはカスタムの戻り値クラスを使用するのとほぼ同じですが、混乱はありません。 (RTTIとリフレクションを使用すると、動的ではありますが、他のソリューションとまったく同じタイプセーフになります。)

結果のタイプと意味、およびメソッドがプライベートかどうかによって異なります。

プライベートメソッドの場合、通常はクラスライブラリのTupleを使用します。

public / protected / internalメソッド(プライベートではない)には、outパラメーターまたはカスタムクラスを使用します。

たとえば、失敗時に例外をスローするXYZメソッドとブール値を返すTryXYZメソッドがあるTryXYZパターンを実装している場合、TryXYZはoutパラメーターを使用します。

結果がシーケンス指向の場合(つまり、処理する必要がある3人の顧客を返す)、通常、何らかのコレクションを返します。

それ以外は、通常カスタムクラスを使用します。

メソッドが2つから3つの関連する値を出力する場合、それらをタイプにグループ化します。値が無関係である場合、メソッドは多すぎる方法である可能性が高いので、多くの単純なメソッドにリファクタリングします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top