1

OOP 言語のタプル クラスのセット: Pair、Triple、Quad がある場合、Triple は Pair をサブクラス化し、Quad は Triple をサブクラス化する必要がありますか?

問題は、私が見ているように、トリプルをペアとして代用できるかどうか、同様にクワッドをトリプルまたはペアとして代用できるかどうかです。トリプルペア、クワッドトリプルとペアか。

1 つのコンテキストでは、このような関係は拡張性にとって価値があるかもしれません。今日、この Thing は Pair of を返しますが、明日は、3 つのうち最初の 2 つだけを使用している既存の呼び出し元を壊すことなく Triple を返す必要があります。

一方、それらはそれぞれ別個のタイプである必要がありますか? ペアを期待するメソッドにトリプルを渡すことができない場合、より強力な型チェックに利点があることがわかります。

私は継承の使用に傾倒していますが、他の人からの意見を本当に感謝していますか?

PS: 場合によっては、クラスは (もちろん) ジェネリックになります。

PPS: もっと主観的な話ですが、名前は Tuple2、Tuple3、Tuple4 にするべきですか?


編集: 私はこれらを疎結合グループと考えています。x/yx/y/z 座標のようなものには特に使用されませんが、そのようなものに使用される場合があります。メソッドからの複数の戻り値に対する一般的な解決策が必要になるようなものですが、非常に単純なセマンティクスを持つ形式です。

とはいえ、他の人が実際にタプルを使用したすべての方法に興味があります。

4

6 に答える 6

1

ほとんどの設計関連の質問と同様に、答えは - それは場合によります。

従来の Tuple 設計を探している場合は、Tuple2、Tuple3 などが適しています。継承の問題は、まず、Triplet が Pair の型ではないことです。equals メソッドをどのように実装しますか? トリプレットはペアと同じで、最初の 2 つの項目は同じですか? ペアのコレクションがある場合、それにトリプレットを追加できますか、またはその逆は可能ですか? ドメインでこれが問題ない場合は、継承を使用できます。

いずれにせよ、これらすべてを実装するインターフェイス/抽象クラス (おそらくタプル) を持つことは価値があります。

于 2009-02-12T05:31:05.377 に答える
1

必要なセマンティクスに依存します-

  • 反対のペアは、類似オブジェクトの 3 タプルと意味的に互換性がありません
  • 極空間の座標のペアは、ユークリッド空間の座標の 3 タプルと意味的に互換性がありません

セマンティクスが単純な構成である場合、ジェネリック クラス Tuple<N> の方が理にかなっています

于 2009-02-12T04:27:05.857 に答える
1

ジェネリック Tuple インターフェイスを作成する (または上記の Collection のようなものを使用する) 必要があり、ペアおよび 3 タプル クラスにそのインターフェイスを実装させる必要があるように私には思えます。そうすれば、ポリモーフィズムを利用できるだけでなく、任意のサイズのタプルよりも単純な実装をペアで使用できるようになります。Tuple インターフェースに、最初の 2 つの要素の省略形として .x および .y アクセサーを含めることをお勧めします。より大きなタプルは、より高いインデックスを持つ項目に応じて独自の省略形を実装できます。

于 2009-02-12T03:39:29.543 に答える
1

タプルの長さが異なると、タイプが異なります。(とにかく、多くの型システムでは。) 厳密に型指定された言語では、それらがコレクションであるべきだとは思いません。

安全性が高まるので、これは良いことです。通常、タプルを返す場所には、各コンポーネントが何であるかについての暗黙の知識である、ある程度結合された情報があります。タプルで予想よりも多くの値を渡すと、さらに悪いことになります。これはどういう意味ですか? 継承には対応していません。

もう 1 つの潜在的な問題は、オーバーロードを使用する場合です。タプルが相互に継承する場合、オーバーロードの解決は、本来すべきではない場所で失敗します。しかし、これはおそらくオーバーロードに対するより良い議論です。

もちろん、特定のユースケースがあり、特定の動作が役立つことがわかっている場合は、これは問題ではありません。

編集: 一般的な情報が必要な場合は、Haskell または ML ファミリ (OCaml/F#) を少し調べて、それらがどのように使用されているかを確認してから、独自の決定を下してください。

于 2009-02-12T05:09:42.073 に答える
0

ギラッド・ブラチャがタプルについてブログに書いていますが、これは興味深い読み物でした。

彼が(正しく判断できないかどうかにかかわらず)1つのポイントは次のとおりでした。

リテラルタプルは、読み取り専用として定義するのが最適です。この理由の1つは、読み取り専用タプルの方が多形であるためです。長いタプルは短いタプルのサブタイプです。

{STU V} <= {ST U} <= {S. T} <= {S}

[および]読み取り専用タプルは共変です:

T1 <= T2、S1 <= S2==>{S1。T1}<={S2。T2}

これは、継承を使用するという私の傾向が正しい可能性があることを示唆しているように思われ、トリプルはペアではないと彼が言った場合、amit.devと矛盾します。

于 2009-02-12T07:38:16.787 に答える
0

0、1、2、または無限大を使用します。たとえば、null、1 つのオブジェクト、Pair クラス、または何らかのコレクションです。

あなたの Pair は Collection インターフェースを実装することさえできます。

Three または Four 項目間に特定の関係がある場合は、おそらく名前を付ける必要があります。

[おそらく問題を見落としているかもしれませんが、一般的な方法で具体的に3つのものをリンクしたい場合が思い浮かびません]

于 2009-02-12T03:12:45.380 に答える