同じ名前のジェネリッククラスを含むファイルを構造化して名前を付ける最良の方法は何ですか?


14

私の現在のプロジェクトでは、同じ名前で汎用パラメーターの数が異なる汎用クラスを作成するという要件に直面しています。例えば:

MyClass<T1>
MyClass<T1, T2>
MyClass<T1, T2, T3>

これらすべてを同じ名前空間に入れたいので、クラスとファイルの構造と名前の付け方について混乱していますか?

クラスをファイルごとに1つに制限し、ファイルが名前空間階層を表すフォルダー構造にあり、ファイルの名前がクラスの名前と一致する必要があるという考えに従う場合、この状況にどのように対処しますか?

私は本当にここに求めています、私は名前を付けるべきであるファイルが含まれMyClass<T1>、そしてどのような私は名前を付ける必要があるファイルが含まれMyClass<T1, T2>?型パラメータの名前はどうあるべきかを尋ねているのではありません。


問題をより詳細に説明するいくつかの具体例を挙げてください。あなたが提供した例はあまりにも... erm、一般的です。 「クラスとファイルを構造化して名前を付ける方法」とはどういう意味ですか?
ロバートハーベイ

Microsoftは、型パラメーターに数値を追加するだけでこれを実行します。タプルドキュメントを参照してください
ピート

@Pete:それは本当にタプルにのみ適用されます。MicrosoftもこのTKey, TValue規則を使用しています。FuncにはTResult型パラメーターがあります。私はあなたが使用できることに同意んがT1T2そうでない場合のような特定の用途はありません入力パラメータの数が可変のためなど、TKeyおよびをTValue
ロバートハーベイ

@RobertHarveyはい、ただし、辞書などの実際のキー/値コレクションのコンテキストでのみです。可変数の型で構成されるものについては、数字が追加されます。別の例を次に示します。msdn.microsoft.com
ピート

1
まあ、あなたの編集はいくつかのコメントを廃止します。:)クラスを同じ物理ファイルに保持できないのはなぜですか?それらが非常に異なるため、それらを別々のファイルに保存する必要がある場合は、それらの違いを教えてください。
ピート

回答:


14
MyGenericClass`1.cs
MyGenericClass`2.cs
MyGenericClass`3.cs

など、バックティックの後の数字はジェネリック型パラメーターの数です。この規則はMicrosoftによって使用されています。

または、次のようなものを使用できます

MyGenericCollectionClass[TKey, TValue].cs

これは、ジェネリック型パラメーターの数だけでなく、特定の名前も保持します。確かに、山かっこは保持されませんが、私たちは人生で必要なものをすべて手に入れることはできません。


1
コンパイラは内部的にジェネリック型の名前をマングルし、バックティックとジェネリックパラメーターの数を追加します。.NETは、ジェネリックパラメーターの数が異なる同じ名前の複数のタイプを許可しませんが、C#は許可するためです。そのため、ファイルの命名規則はコンパイラーが行うことと一致します。
CodesInChaos

1
私はあなたが間違っていることを証明したかったのですが、実際にはあなたは正しいです: github.com/dotnet/corefx/tree/master/src/… 私はこの慣習が好きではありません。
デン

1
@Den、彼らは今、その慣習を後悔しているようです。多分それはいくつかの問題を暗示していますか?github.com/dotnet/corefx/commit/…-
サム

@Samうまくいけば、Microsoftチーム間のコミュニケーションの問題ではありません。誰もそれをしていないからです。また、私の意見では、ライブラリチームではなくコンパイラチームが決定します。
デン

ファイル名に「 `」を使用するためのボールがありません。
クリスチャンE.

4

以下の場合TupleActionピートが言及していることを、マイクロソフト自体が1つのファイルを使用-を参照してTuple.csAction.csを

すべてのクラスの機能が基本的に同じかどうかに一部依存すると思います。個人的には、クラスを1つのファイルにまとめるのは嫌いですが、これは例外かもしれません。私が働いているソースコードでは、自動生成(T4を使用)NamedTupleクラスを追加しました。これは、と同じように機能しTupleますが、コンストラクターの最初の引数として文字列名を使用します。

質問に答えるために、単一のファイルを使用したくない場合はMyClass<T1>、MyClass_1.cs for MyClass<T1, T2>、MyClass_2.cs for などを使用します。

しかし、どちらのオプションも理想的ではないため、「Microsoftがこのように行うので...」という議論を提案したいと思います。


2
TupleそしてAction、すべての代表者です。実装コードはないので、すべてのバリエーションを別々のファイルに入れることは、とにかく無意味です。すべてのルールに例外があることを証明してください。
ロバートハーベイ

ええ、一般的に言えば、複数のパブリックデリゲートを同じファイルに入れることは問題ありません(それらが関連している場合)。
スティーブン

1
@RobertHarvey Tupleはデリゲートではありませんが、とにかく各実装は短いです。
アルトゥーロトーレスサンチェス

@ArturoTorresSánchez:そうですね、考えていましたFunc
ロバートハーヴェイ

0

クラスが本当に同じ意図を持っているかどうかを自問しましたか?あるクラスが他のクラスよりもジェネリックである場合、それはGenericClassMoreGenericClass、およびMostGenericClassになります。クラスの各型パラメーターがクラスに新しい次元を追加することを想像してください。そのため、どの次元であるかを尋ねるのに役立つ場合があります。

この例を見てみましょう:

  • Container<Thing>
  • MetricContainer<Thing, Metric>
  • MetricTransportableContainer<Thing, Metric, Transport>

私はそれが最良の例ではないことを承知していますが、3つの次元を示すことは非常に表現力があります。

  • 内寸、ロードできるもの
  • メトリックディメンション。ロードできるメトリックは、物事のカウント、二乗測定、または立方体の容量または重量のみです。
  • ロードできる外部ディメンション。

したがって、車の輸送をモデル化できます。

Container<Cars>
MetricContainer<Cars, CountMetric>
MetricTransportableContainer<Cars, CountMetric, Ship>

流体の輸送:

Container<Fluid>
MetricContainer<Fluid, Volume>
MetricTransportableContainer<Fluid, Volume, Shelf>

エネルギーの輸送:

Container<Energy>
MetricContainer<Energy, ElectricPower>
MetricTransportableContainer<Energy, ElectricPower, Box>

砂糖、穀物の輸送:

Container<CrumblyMaterial>
MetricContainer<CrumblyMaterial, Weight>
MetricTransportableContainer<CrumblyMaterial, Weight, Silo>

ああ、なんて驚きList<T>だ。aには、リストが保持できるものを表す1つの次元があります。これにはMap<T, S>、マップが保持できるものとアクセスキーを表す2つのディメンションがあります。


1
あなたが質問を理解したとは思わない。質問の最後の段落を見てください。
ロバートハーヴェイ

1
@RobertHarvey質問を注意深く読んでください:クラス名はファイル名と同等でなければなりません。互換性があります。問題は、クラスの誤った分析と一般的なジェネリッククラスの誤った命名にあります。私の答えを要約すると、「それが何であるか、それが何であるかではなく、それを何と名付けてください。」
shylynx


1
@RobertHarvey私の答えを読んでください:1つのクラスを1つのファイルに入れてください!
shylynx

1
あなたはポイントを逃していると思います。質問は次のとおりです。名前を衝突させずに、標準的な方法でTuple<T1>Tuple<T1, T2>およびTuple<T1, T2, T3>を別々のCSファイルに配置するにはどうすればよいですか。
ロバートハーヴェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.