新しいSystem.Tupleクラスの使用は設計が悪いですか?


19

System.Tupleのコンセプトは、新しいクラスをインスタンス化せずに単一の関数呼び出しで複数のパラメーターを返すことができるという点で気に入っていますが、Microsoft Patterns&Practices、SOLID Principlesなどの優れたプログラミングプラクティスを無視します。

私はこの機能をどれだけ自由に使用すべきか、または必要なときにエッジケースシナリオでのみ使用すべきかどうかを測定しようとしています。


+1:すばらしい質問。また、Anders Hejlsbergがこれを重視していたのだろうか。
ジムG.

回答:


11

使用に関する問題Tupleは、ジェネリック型パラメーターが意味を伝えないことです。

読みやすくするために、カスタムクラスまたは名前付きメンバーを持つ匿名型の使用を検討することもできます。


XMLパラメーターの説明はどうですか?見やすい場所ではありませんが、何もないよりはましです。
ジョンブブリスキー

@SkippyFire-どういう意味ですか?あなたが得るすべてはのタイプであるT1T2などは、彼らが何を意味するかを教えてくれません。
Oded

2
私(または私たちのチームの誰か)がタプルを型として使用するたびに、コード内の他の部分を常に参照して、.Item1、.Item2などが何であるかを覚えています。完全に自明ではないものについては、個別のクラスを作成します。将来、自分が何をしていたかを知るチャンスを自分に与えてください。
ジョー

@Oded タプルを受け入れるメソッドにXMLドキュメントを追加することについて話しています。繰り返しになりますが、完璧ではありませんが、タプルを使用したい/必要がある場合は、何もないよりはましです。
ジョンブブリスキー

1
@Odedまた、パラメータまたは戻り値は意味を伝えないかもしれませんが、メソッドの名前は伝えることができます。a GetTopTwoPercentages()を返すというメソッドがあるとしましょうTuple<decimal, decimal>。それは十分に明らかかもしれません。
ジョンブブリスキー

8

最も重要なコード品質の1つは読みやすさです。自問してみてください:
私(つまり、あなた以外の誰か)がメソッドシグネチャを見ると、それぞれのコンポーネントが持つ意味を知ってTupleいますか?
たとえば、返すフロートのペアが極座標のセットである場合、これは明らかですか?

これは明らかです:

Tuple<Float, Float> getPolarCoords();

これは誤解を招く可能性があります(デカルト座標を仮定するため)。

Tuple<Float, Float> getCoords();

そして、これは意味を欠いています:

Tuple<Float, Float> getTuple();

そのため、一般的に言えば、ケースごとに明確性を評価し、必要に応じてリファクタリングを行います。Tuple多くの異なる場所と同じ種類のデータを表す場合、クラスを作成することは間違いなく良い考えです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.