web-dev-qa-db-ja.com

Java(複数の文字を含む)のジェネリック型パラメーターの命名規則?

私が書いたいくつかのインターフェースでは、コードを読みやすくするために、複数の文字でジェネリック型パラメーターに名前を付けたいと思います。

何かのようなもの....

Map<Key,Value>

これの代わりに...

Map<K,V>

しかし、メソッドに関しては、型パラメーターはJavaクラスのように見えますが、これも混乱を招きます。

public void put(Key key, Value value)

これは、キーと値がクラスのようです。私はいくつかの表記法を見つけた、または考えましたが、Sunの慣習や一般的なベストプラクティスのようなものはありませんでした。

推測または発見した代替案...

Map<KEY,VALUE>
Map<TKey,TValue>
116
chaper29

Javaチュートリアル>ジェネリック>ジェネリック型 で以下をお勧めします。

型パラメーターの命名規則

慣例により、型パラメーター名は単一の大文字です。これは変数と明確に対照的です 命名 あなたがすでに知っている慣習、そして正当な理由:この慣習がなければ、型変数と通常のクラスまたはインターフェースの違いを見分けるのは難しいでしょう名前。

最も一般的に使用される型パラメーター名は次のとおりです。

  • E-要素(Java Collections Framework)で広く使用されています)
  • K-キー
  • N-番号
  • T-タイプ
  • V-値
  • S、U、Vなど-2番目、3番目、4番目のタイプ

これらの名前は、Java SE APIおよびこのレッスンの残りの部分で使用されます。

開発者と可能なメンテナーの間の混乱を避けるために、私はそれに固執します。

173
BalusC

Typeを追加

適切な議論は、DZoneページのコメント、 パラメータ化された型の命名規則 にあります。

Erwin Muellerのコメントを参照してください。彼の提案は私にとって完全に明白な理にかなっています:Word Typeを追加します。

Appleアップル、車、車。問題の名前はデータ型の名前ですよね?(In [〜#〜] oop [〜#〜 ] 、クラスは基本的に新しいデータ型を定義します。)それを「タイプ」と呼びます。

元の投稿の記事から引用したミューラーの例:

public interface ResourceAccessor <ResourceType, ArgumentType, ResultType> {
    public ResultType run (ResourceType resource, ArgumentType argument);
}

Tを追加

重複した質問は、Andy Thomasによる this Answer を提供します。 Googleのスタイルガイドからの抜粋で、複数文字のタイプ名は単一の大文字Tで終わることを示唆しています。

42
Basil Bourque

はい。クラス名と明確に区​​別される限り、型変数に複数文字の名前を使用できます。

これは、2004年にジェネリックが導入されたSunの提案する規則とは異なります。ただし、

  • 複数の規則が存在します。
  • 複数文字の名前は、 GoogleのJavaスタイル など、他のJavaスタイルと一致しています。
  • 読みやすい名前は(サプライズ!)より読みやすいです。

読みやすさ

私が書いたいくつかのインターフェースでは、コードを読みやすくするために、複数の文字でジェネリック型パラメーターに名前を付けたいと思います。

読みやすさは良いです。

比較する:

    public final class EventProducer<L extends IEventListener<E>,E> 
            implements IEventProducer<L,E> {

に:

    public final class EventProducer<LISTENER extends IEventListener<EVENT>,EVENT> 
           implements IEventProducer<LISTENER, EVENT> {

または、Googleの複数文字の規則を使用:

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

Googleスタイル

Google Java Style Guide は、1文字の名前と、Tで終わる複数文字のクラスのような名前の両方を許可します。

5.2.8型変数名

各型変数には、次の2つのスタイルのいずれかで名前が付けられます。

  • オプションで単一の数字が続く単一の大文字(ETXT2など)

  • クラスに使用される形式の名前(セクション5.2.2、 クラス名 を参照)、その後に大文字のTが続きます(例:RequestTFooBarT)。

課題

「この規則がなければ、型変数と通常のクラス名またはインターフェイス名の違いを見分けるのは難しいでしょう。」– Oracleチュートリアル「汎用型」

上で見たように、単一文字の名前は、型パラメーターとクラス名を区別する唯一の方法ではありません。

なぜJavaDocでtypeパラメーターの意味を文書化しないのですか?

@param JavaDoc要素がより長い説明を提供できることは事実です。しかし、JavaDocsが必ずしも表示されないことも事実です。 (たとえば、タイプパラメーター名を表示するコンテンツアシストがEclipseにあります。)

複数文字タイプのパラメーター名は、Oracleの規則に従っていません!

Sunの元の規則の多くは、Javaプログラミング。

ただし、この特定の規則はそうではありません。

競合する規則の中で最良の選択は意見の問題です。この場合、Oracle以外の規則を選択した場合の結果はわずかです。あなたとあなたのチームは、あなたのニーズに最適なコンベンションを選択できます。

16
Andy Thomas

Javadocを使用して、少なくともジェネリッククラスのユーザーに手がかりを与えることができます。私はまだ好きではありません(@ chaper29に同意します)が、ドキュメントが役立ちます。

例えば、

/**
 * 
 * @param <R> - row
 * @param <C> - column
 * @param <E> - cell element
 */
public class GenericTable<R, C, E> {

}

私が知っているもう一つのことは、my IDEを使用して、規則を破るクラスをリファクタリングします。その後、コードを操作し、1文字にリファクタリングします。型パラメーターが使用されます。

15
Tom Carchrae

公式の命名規則 が1文字を使用することを推奨する理由は次のとおりです。

この規則がなければ、型変数と通常のクラス名またはインターフェイス名の違いを見分けるのは難しいでしょう。

現代のIDEでは、その理由はもはや有効ではないと思います。 IntelliJ Ideaは、通常のクラスとは異なる色でジェネリック型パラメーターを表示します。

IntelliJ Idea 2016.1に表示されている汎用タイプのコードCode with generic type as displayed in IntelliJ Idea 2016.1

その違いのために 私はより長い説明的な名前を使用します 私の一般的な型に対して、通常の型と同じ規則で。 TやTypeなどのプレフィックスやサフィックスは不要なノイズと見なされ、一般的なタイプを視覚的に区別する必要がなくなったため、追加しません。

注:私はEclipseまたはNetbeansのユーザーではないため、類似の機能を提供しているかどうかはわかりません。

14
Vojtech Ruzicka