Task
という名前の抽象クラスがあるとします。
代わりにAbstractTask
と名付ける必要があることを示唆する標準または規則はありますか?
Blochの効果的なJava(アイテム18))によれば、抽象プレフィックスは特別な場合に使用される規則です。
エクスポートする重要な各インターフェースに対応する抽象スケルトン実装クラスを提供することにより、インターフェースと抽象クラスの長所を組み合わせることができます。 ...慣例により、スケルトン実装はAbstractInterfaceと呼ばれます。ここで、Interfaceは、それらが実装するインターフェースの名前です。
しかし、Blochは、SkeletalInterfaceという名前は理にかなっていると指摘していますが、
アブストラクトコンベンションは現在、しっかりと確立されています。
他の回答が指摘したように、一般に、この命名規則をすべての抽象クラスに適用する理由はありません。
慣習はありません。それは、開発者としてのコードをより速く、より良いものにし、他の人があなたのコードを理解するのを助けるためのものです。
コードを確認して維持する人に尋ねます。彼らはむしろ何を見ますか?何が彼らを楽にしますか?次に、彼らが望むものに基づいて名前を付けます。
別の注記では、 Javaプログラミング言語のコーディング規約:9.命名規約 は要件を示唆していません:
クラス名は名詞でなければならず、大文字の大文字の各内部Wordの最初の文字が大文字と小文字が混在しています。クラス名はシンプルでわかりやすいものにしてください。単語全体を避け、頭字語や略語は使用しないでください(略語がURLやHTMLなどの長い形式よりもはるかに広く使用されている場合を除きます)。
いいえ。Intellisenseはそれが抽象的であるかどうかを簡単に教えてくれるので、DRYここに違反しています。
これはやや好みの問題ですが(境界の悪い習慣です)、ほとんどの人はクラスの名前に修飾子の一部を見るのが好きではありません。
ほとんどのIDEはとにかくその情報を簡単に利用できるようにするので、名前に入れる必要はなく、単に省略するだけで済みます。これは、変数の命名に関するハンガリーの表記法を連想させるものであり、今日では確かに悪い形式と見なされています。単にTask
と呼ぶことをお勧めします。
.NETでは、抽象基本クラスを示す接尾辞として「Base」を使用することがよく見られます。これがJavaの一般的な慣習であるかどうかについては、他の回答を優先します。
私の意見では、エンティティの名前は、そのタイプ構造に関する情報ではなく、そのセマンティクスに関する情報を伝える必要があります。したがって、抽象化が実行時の目標の一部でない場合、クラスを「AbstractSomething」として定義しても意味がありません。これが基本抽象クラスであることは、プログラマーから見ることができ、名前に反映する必要はありません。
ただし、抽象ファクトリの実装をAbstractFactoryと呼ぶのに最適な場合、それはクラスの意図に関連するためです。
一般に、クラスの目標に関するほとんどの情報を伝えるのに役立つ命名規則を使用してください。
同様に、SomethingImpl
を避けてください。これが実装であり、基本クラスではないことは気にしません。クラス階層が継承のために適切に設計されている場合、誰かが継承から継承する可能性があります。確かに、「Impl」サフィックスやその他のアーティファクトを追加しても、それらに価値はありません。また、「インターフェース」接尾辞または「I」接頭辞を追加しても意味がありません。
検討してください:
IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl
とは対照的に:
Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
<-- Ferrari
<-- Trabi
私は後者をはるかに好みます。
これは、いくつかの点で、 露骨な誤用 と似ています ハンガリー語表記 後者 悪い表現にした 、人々が誤って解釈し始めたため変数の型のインジケーターを変数の前に付けることを開発者に要求するためです。これには用途がある場合がありますが(ほとんどの場合、型の定義を調べるのが面倒な場合)、ほとんど役に立ちません。 Simonyiのハンガリー記法の最初のアイデアは、それをニーモニックとして使用して、エンティティのタイプではなくエンティティの機能を思い出させることでした。
経験則として、構文から明らかなプロパティを名前に含めないでください。 Javaでは、適切な名前のabstract
キーワードで抽象クラスをマークする必要があるため、名前に含めません。たとえばC++では、ケースはそれほど明確ではありませんが、少なくとも抽象クラスを誤って使用した場合はコンパイラーから通知されます。 Python=のようなもので、抽象クラスに明示的に名前を付けることは悪い考えではありません。
ルールの通常の例外は、名前があいまいな場合です。何らかの理由で、具体的なサブクラスTask
(他の例では、これはより賢明かもしれませんが、何でも)がある場合は、AbstractTask
を使用してください。
protected abstract SomeClass { }
これにより、これが抽象クラスであることがわかります。接頭辞の追加は トートロジーとアンチパターン であり、ほとんどの場合適切ではありません。たとえば、package local
が例外であることを示すリンクを参照してください。
ほとんどの場合、Abstract
クラスは公開APIの一部であってはなりません。もしそれが本当に正当な理由であり、正当な理由がAbstractSomeClass
以外の明らかに良い名前を提供する必要がある場合です。
ほとんどの場合、よりわかりやすい名前を付けることができない場合は、おそらくいくつかの再設計を行う必要があります。
私の5セント、おそらくその抽象クラスの実装があり、それらは「SomeSpecificTask」、「TaskWithBubbles」、「StrangeTask」などの名前になります。したがって、抽象「Task」とそれらの間に名前の衝突はありません。
さらに、「抽象的な」Wordは、ビジネスドメインエンティティではなく、言語構文に関するものであるため、名前の一部として使用しない方がよいでしょう。
一方、ここでの1つの答えとして、J.Blochからの抜粋を見てみましたJavaこれは、名前の一部として「抽象」を使用することは十分に確立された慣行であることを示しています。しかし、とにかく公式のJavaコード規約では、それについては何もありません。