C#のジェネリック型の適切な命名規則は何ですか?[閉まっている]


16

かなり主観的であるため、スタックオーバーフローではなく、ここでこの質問をすることにしました。

C#では、通常、非常に貧弱な名前のジェネリック型が表示されます。特に、「T」は一般的に使用されますが、それ自体では意味のある名前ではありません。例えば:

class Fruit<T>
{
    T fruit;
}

これは典型的なアプローチですが、これに反対する人はいますか?もしそうなら、一般的な関数とクラスのC#のコンテキストでの一般的な型の合理的な命名規則は何でしょうか?

前の例では、ジェネリック型Tは常にAppleor などの果物の型である必要があると仮定しましょうOrange。タイプは、Tそれは明らかに、それは果物の種類だことを確認する必要があるので、多分、より良い名前のようになりFruitType、我々はで終わるので、:

class Fruit<FruitType>
{
    FruitType fruit;
}

これは、皆さんに私が探しているもののアイデアを提供するためのものです。この問題で受け入れられる「経験則」とは何ですか?


3
これは建設的な質問ではありません。ポスターのお気に入りのスタイルでのみ回答が得られます。
マイケルK

1
あなたの例を考慮して制約を見てください
Matthieu

2
@Michaelには多くの回答があり、受け入れられる回答はロバートのお気に入りですが、他のさまざまな回答が投票されます。
StuperUser

5
@Michael主観的な質問には主観的な答えが得られます。この問題は、この特定の問題に対するさまざまなアイデア/解決策を求めている人にとっての基準点として役立つため、まだ建設的です。私が答えとしてマークしたものは、唯一の有用な情報ではありません。
void.pointer

おそらく主観的ではありますが、優れたリソースとして、コミュニティWikiに変えるのでしょうか?
タイラーマック

回答:


22

それは確かに主観的です... っぽい
一部の人々がiforループ変数に対して完全に有効であると考えるようTに、ジェネリッククラスの型プレースホルダーに対して完全に有効であると考える人もいます。

私は個人的にこのアプローチを支持しています。これは一般的な慣習であり、一般的に人々あなたの意味を知っています。

型が意味のある場合、意味のある名前を使用しますが、一般的にはTで開始します。最近、一般的な辞書クラスを開発し(尋ねないで)、宣言は

public class Dictionary<TKey, TValue>

ただし、タプルのようなもので、型が本質的に無意味であるものについては、以下を完全に受け入れられると考えます。

public class Tuple<T1, T2, T3>

2
私はこの主観をまったく見つけません。iそしてT仕事、これは原則的に測定可能である(ソースコードの増加の理解が言う、場合かどうか、それは、測定のIE、ループインデックスは異なる識別子を取得します)。それはちょうどので、ハード対策に我々はすべての「主観」のラベルをタグ付けする必要が意味するものではありません。明らかな問題のない幅広い使用を考えると、これが実際に機能することを測定せずとも言うのは非常に合理的です。
コンラッドルドルフ

2
@コンラッド:あなたはポイントを持っています。。。ただし、質問は主観的なものとしてタグ付けされていませんが、質問者は、人々が命名規則に対して独自の好みを持っている傾向があると仮定して、主観的なトピックであることを認めています。そのため、質問は主観的ではないかもしれませんが(実際、Microsoftの公式ガイドラインにリンクする答えなど、正しい答えがあるわけではありません)、トピックは主観的です。 「iそしてT悪である。1文字の名前を決して使用してはならない」と答えてください。みんなを満足させるためにイッシュを追加しました:)
バイナリウォーリアー

1
回答自体は非常に有用ですが、この投稿に追加されたコメントだけで非常に貴重な回答になると思います。T制約のない型について話しているときに理にかなっていますTFruitが、それは「果実であるという制約のある型」と私に言うので理にかなっています。これは、ジェネリック型パラメーターの命名に適した「経験則」のようです。ありがとう!!
void.pointer

1
これは、MSDNのライブラリ開発者向けの.NET Framework設計ガイドラインと一致しています。参照:ジェネリック型パラメーターの名前
グラントトーマス

7

Tはかなり標準になっていますが、あなたは正しいと思います。これはおそらく、古いC ++時代と「T型」という言葉に由来しています。できる限り説明的にするのは良い習慣だと思いますが、それは主観的なものです。

多くの人がインターフェイスにIを選択するように、Tをプレフィックスとして選択できます。かくして

class Juice<TFruit> where TFruit...

私の謙虚な意見では良い名前でしょう。ほとんどの場合、接尾辞よりも接頭辞の方が好きです。つまずいたときに見ているものがすぐにわかり、Intellisenseのようなもので検索するのが簡単になるからです。タイプ(TextBoxなど)を常に知っている可能性が高いが、与えた説明的な名前が100%わからない場合は、UIコントロールにもお勧めします。

マイナス面は、型自体がTで始まる場合に見た目が悪くなることです。したがって、以下のような特別な場合にジェネリック型に接尾辞を付けるのは良いことだと思います。

class SomeAlgorithm<TypeT> where TypeT : Type

これは単なる私の意見であり、非常に主観的であることに注意してください。しかし、接尾辞よりも接頭辞を優先することに関して、私は小さな点を持っていると思います。


フレームワーク設計ガイドラインでは、T型パラメーターおよびIインターフェイス名にプレフィックスを使用することが明示的に必要です(「DO ...」ルール)。
リチャード

1
TFruithereを使用して何がテーブルにもたらされるかは疑問Tです。TTypeまたはなどの名前を使用することTypeTは、確かにナンセンスです。それだけで情報を追加しませんT。まったく同じ情報が伝えられます。
コンラッドルドルフ

@Konrad Rudolph:TypeTの私の例をよく見てください。System.Typeを扱うときの特別なケースをカバーしています。特にジェネリックも制約されている場合、タイプにTを使用するよりも、私の名前のエントロピーが高いと思います。
ファルコン

7

Microsoftには、ジェネリックに関する公式のガイドラインがあります:クラスの名前、構造体、およびインターフェイスここで引用、本の形で:フレームワーク設計ガイドライン)。

あなたの特定の質問については、それは言う:

一文字の名前が完全に自明であり、説明的な名前が価値をもたらさない場合を除き、一般的なタイプのパラメーターには説明的な名前を付けてください。

IDictionary<TKey, TValue> 

このガイドラインに従ったインターフェースの例です。

1文字の型パラメーターを持つ型の型パラメーター名として文字Tを使用することを検討してください。

記述型のパラメータ名の前にTを付けます。

パラメーターの名前で型パラメーターに設定された制約を示すことを検討してください。たとえば、ISessionに制約されているパラメーターはTSessionと呼ばれる場合があります。


より良いリファレンスは、Framework Design GuidelinesブックまたはMSDNの(概要)、特にNames of Classes、Structs、およびInterfacesです。
リチャード

@Richard:コメントを考慮して私の回答を調整しました、ありがとう!
マチュー

2

ジェネリックのポイントは、機能を委任することです。ジェネリッククラスは1つのことを行い、引数は別のことを行います。教科書の例は一般的なコレクションです。コレクションは「もの」を格納しますが、これらが何であるかは気にしません。したがって、総称名(sic!)には特定のロジックがあります-「T包括的型引数」以外に説明するものはないため、記述的には望ましくありません。コンベンション)。記述的であることは良いことですが、過度に記述的であることは、そこにない制限を示唆します。

ただし、ジェネリッククラスまたはメソッドに複数の型パラメーターがある場合があります。この時点で、それらの役割が明らかになるように、よりわかりやすい名前を付けることが理にかなっています。良い例は、キーと値の両方がジェネリックであるキーと値のコレクションタイプです。それらを呼び出すTS(あるいはQあるいは何でも)は、それらを呼び出す未満有用言う、うKeyTypeValueType、あるいはTKeyTVal


1

答えは確かに主観的です。ただし、コードは自己文書化する必要があるため、質問としてのメリットがあり、おそらくそれを行うためのより良い方法をすべて学ぶことができます。

以下は、私が学んだ慣習です。

  • ジェネリック型パラメーターは、具象クラスと間違われることはありません。これは一般的に、Tインターフェースが一般的にで始まるように、続くものに関係なく、の前書きを奨励しIます。

  • 通常、クラスまたはメソッドの単一のジェネリック型パラメーターにはラベルを付ける必要がありますT。これは、C ++テンプレートにさかのぼるほぼ普遍的に理解されている規則です。

  • 同じクラスまたはメソッド宣言の複数のジェネリック型パラメーターはすべてTで始まる必要がありますが、簡潔だが理解可能な手段で区別されます。TInおよびTOutは、たとえば、強く型付けされたジェネリック入力を受け入れ、強く型付けされたジェネリック出力を生成するメソッドの一般的でよく理解されているGTPです。

  • .NetのTupleのような包含クラスやFunc、Predicate、Actionのようなデリゲート型など、複数の区別されているが目立たない型には、T1、T2、T3などのラベルを付けることができます。 /または非常に具体的な型の制限)より説明的なものが必要です。

  • 含まれるクラスのジェネリック型とは異なるメソッドの単一のジェネリック型は、クラスまたはメソッドの複数の型に関する前述の規則に従うか、または型が異なる以外に目立たない場合は、異なるものを指定できます。単一の文字、多くの場合、UまたはV。これもまた、C ++テンプレートに由来する慣習です。

  • 何を選択しても、一貫性を保ちます。2番目のクラスが最初のクラスでネストされており、2番目のクラスで使用できない場合を除き、1つのクラスTと次のクラスのGTPにラベルを付けないでください。TParamT

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