抽象クラスに「抽象」プレフィックスを追加する必要がありますか?[閉まっている]


20

という名前の抽象クラスがあるとしTaskます。

AbstractTask代わりに名前を付けることを提案する標準または規則はありますか?


ここにリストされている命名規則:oracle.com/technetwork/java/codeconventions-135099.htmlは、このリンク:stackoverflow.com/questions/1006332/…を使用することをお勧めします。
FrustratedWithFormsDesigner

C#の標準的な規則は、「* Base」を使用したサフィックスです。
デン14年

回答:


26

BlochのEffective Java(Item 18)によると、Abstractプレフィックスは特別な場合に使用される規則です。

抽象骨格実装クラスを提供して、エクスポートする各自明でないインターフェイスに対応することにより、インターフェイスと抽象クラスの長所を組み合わせることができます。...慣例により、骨格実装はAbstractInterfaceと呼ばれます。Interfaceは実装するインターフェースの名前です。

しかし、Blochは、SkeletalInterfaceという名前は理にかなっていると指摘していますが、

アブストラクトコンベンションが確立されました。

他の回答が指摘しているように、一般的にこの命名規則をすべての抽象クラスに適用する理由はありません。


15

慣習はありません。開発者があなたのコードをより速く、より良くし、他の人があなたのコードを理解するのを助けるのは、すべてです。

コードを見て保守する人に尋ねてください。彼らはむしろ何を見ますか?それらで何が簡単になりますか?次に、希望するものに基づいて名前を付けます。

別の注意として、Javaプログラミング言語のコード規約:9.命名規約は要件を示唆していません:

クラス名は名詞で、大文字と小文字が混在する各内部単語の最初の文字を使用する必要があります。クラス名はシンプルでわかりやすいものにしてください。単語全体を使用して、頭字語や略語を避けます(略語がURLやHTMLなどの長い形式よりもはるかに広く使用されている場合を除く)。


13

いいえ。IntelliSenseは抽象的かどうかを簡単に教えてくれるので、ここでDRYに違反しているだけです。


21
-1 abstractクラス名に追加してもDRYに違反することはなく、全員がインテリジェンスを使用するわけではありません。たとえば、Webページのコードを読んでいる場合、またはプレーンテキストエディターまたは外部diffツールで表示しているパッチの一部である場合はどうしますか?
ブライアンオークリー

10
@ブライアン:もちろん、DRYに違反しています。abstract class AbstractName?明らかに「抽象」が2回ある。Intellisenseを使用していない場合、それが問題です。他のすべてのユーザーは、適切なツールを使用してコードを表示します。
DeadMG

13
「みんな」?私が知っているほとんどの人はemacsとviを使いますが、少数の人は日食を使います。何かを「あなたの問題」と言うことは、チームワークの定義ではありません。私が下手に言ったのは、ブランケットルールを設定して、それが完了したと言うことはできないということです。チームごとに異なる要件があり、すべての人がインテリセンスの支援を必要とするわけではありません。さらに、私が言ったように、プライマリエディターまたはIDE以外のツールでコードを見ている場合が多くあります。
ブライアンオークリー

1
+1は間違いなくDRYに違反します。Intellisenseに依存することは少し強力ですが、基本クラスを使用している人は少なくとも、SOLIDの一部として拡張しているものを確認する必要があります。
ゲイリーロウ

8
@BryanOakleyなぜ公開も最終版も置いてみませんか?クラス名は、PublicAbstractPersonThatImplementsInterfaceHumanのようになります。うーん、それが良いかどうかはよくわかりません。しかし、私は同意します。普遍的な慣習のようなものは何もありません。チームの集合生産性を高めるものなら何でも使用してください。
Apoorv Khurasia

9

これはやや好みの問題ですが(境界線の悪い習慣)、ほとんどの人はクラスの名前に修飾子の一部を見ることを嫌います。

ほとんどのIDEは、とにかくその情報を簡単に利用できるようにするため、名前に入れる必要はなく、単に省略したほうがきれいです。これは、変数の命名のハンガリー表記を連想させるものであり、これは確かに今日では不適切な形式と考えられています。単に呼び出すことをお勧めしTaskます。


9

.NETでは、抽象基本クラスを示すための接尾辞として「Base」が使用されることがよくあります。これがJavaの一般的な慣行であるかどうかについては、他の回答を保留します。


1
「Base」および「Impl」サフィックスの場合は+1。それらは構造的なポイントを作成します(抽象クラ​​スが何かのベースになります)。
vski

7
@vski:いいえ、私は強く同意しません:彼らは尻の役に立たない痛みです。一般に、インターフェイスまたはベースクラスにインターフェイスを説明する一般的な名前を付け、さらに具体的な実装をより明示的な名前で指定することは、まったく問題ありません。
ヘイレム

3
インターフェースの背後にある基本クラスには... Baseを使用する傾向があります。良い名前はすでにインターフェイスによって取得されており、基本クラスはクライアントコードでは使用されません。
スターブルー

1
@Haylem多くのJavaデザインパターンは、期待される実装が1つだけのインターフェースを使用します。これらの場合、Implは非常に便利な接尾辞です。
ファンキーブロ

Implの使用に関しては、デフォルトとImplを参照してください-Implに近づかないでください!Baseをサフィックス(TaskBaseなど)として使用すると、基本クラスが言語構造ではなくパターンであることを意味します。
ゲイリーロウ

8

私の意見では、エンティティの名前はそのタイプ構造に関する情報ではなく、セマンティクスに関する情報を伝える必要があります。したがって、抽象化が実行時の目標の一部ではない場合、クラスを「AbstractSomething」として定義することは意味がありません。それが基本抽象クラスであることはプログラマーに見えるため、名前に反映する必要はありません。

ただし、抽象ファクトリの実装をAbstractFactoryと呼ぶのが完璧な場合は、クラスの意図に関連しているためです。

一般に、クラスの目標に関する最も多くの情報を伝えるのに役立つ命名規則を支持します。

同様に、から離れてくださいSomethingImpl。基本クラスではなく、実装であることを気にしません。クラス階層が継承用に適切に設計されている場合、誰かがそれを継承できます。確かに、「Impl」サフィックスやその他のアーティファクトを追加しても、それらには価値はありません。「Interface」サフィックスまたは「I」プレフィックスを追加することにも価値はありません。

考慮してください:

IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl

とは対照的に:

Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
                                   <-- Ferrari
                                   <-- Trabi

私は後者をはるかに好む。


これは、いくつかの点では、と同様の露骨な誤用ハンガリアン記法後者はそれをそれにその悪評を与えた人々が誤って変数の型の指標とその変数の前に付けるために、開発者が必要とするものとしてそれを解釈するために始めたとして、。これには用途がある場合がありますが(ほとんどの場合、型の定義を検索するのが面倒な場合)、ほとんど役に立ちません。ハンガリー記法に関するSimonyiの当初のアイデアは、それをニーモニックとして使用して、そのタイプではなく、エンティティの機能を開発者に思い出させることでした。


3

良い経験則は、構文から明らかな名前にプロパティを含めないことです。Javaでは、抽象クラスを適切な名前のabstractキーワードでマークする必要があるので、抽象クラスを名前に含めません。たとえば、C ++では、ケースはそれほど明確ではありませんが、少なくともコンパイラーは、抽象クラスを誤って使用したことを通知します。再びPythonのようなものでは、抽象クラス自体を明示的に命名することは悪い考えではありません。

規則の通常の例外は、名前があいまいな場合です。何らかの理由で具体的なサブクラスがある場合Task(他の例では、これはより賢明かもしれませんが、何であれ)、を使用してくださいAbstractTask


...またはListand などのインターフェースAbstractList(それを実装する)。

3
protected abstract SomeClass { }

これにより、これが抽象クラスであることがわかります。接頭辞の追加はトートロジーおよびアンチパターンであり、ほとんどの場合適切ではありませんpackage local。たとえば、例外であることについて言及しているリンクを参照してください。

ほとんどの場合、Abstractクラスは一般向けAPIの一部であってはなりません。もしそれが本当に正当な理由があり、正当な理由が以外の明らかに適切な名前を提供するべきであるならAbstractSomeClass

ほとんどの場合、よりわかりやすい名前を思い付かない場合は、おそらく再設計を行う必要があります。


0

私の五セント、おそらくあなたはその抽象クラスの実装を持ち、それらは「SomeSpecificTask」、「TaskWithBubbles」、「StrangeTask」などと命名されるでしょう。したがって、抽象「Task」とそれらの間に名前の衝突はありません。

さらに、「抽象」という言葉はビジネスドメインエンティティではなく、言語の構文に関するものなので、名前の一部として使用したくないと思います。

一方、ここでの答えの1つに、J.Bloch Effective Javaからの抜粋がありました。これは、名前の一部として「抽象」を使用することは、確立された慣行であると述べています。そうかもしれません。しかし、とにかく公式のJavaコード規約ではそれについて何もありません。


public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>- クラスListの名前として使用できないのAbstractListは、それがインターフェースの名前だからです。これは確立された慣行であり、インターフェースを実装するものが抽象クラスを拡張する場合もしない場合もある(インターフェースの(一部)も実装する)使用中の公式Javaコードの一部です。

-1

チームで作業する場合、チーム全体が抽象クラスの前に「Abstract」を付けるかどうかを決定する必要があります。

自分で作業する場合、それは完全にあなた次第であり、このサイトの私や他の人ではありません。



-2

抽象AbstractSyntaxTreeクラスを書きたい場合はどうしますか?それとも単に要約SyntaxTreeですか?

それは従来のものではなく、人々を簡単に混乱させることができます。


-2

これをやった。AbstractOperationという抽象クラスにプレフィックスとして 'Abstract'を追加しました。私がこれを行った理由は、Operationという名前の非抽象クラスを持つ別のパッケージがあり、それが私のチームと後で引き継いだプログラマーを助けて、両者の混乱を避けるためでした。

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