C#クラスの命名規則:BaseClass、ClassBase、AbstractClass


117

基本クラスの命名に推奨されるアプローチは何ですか?タイプ名の前に「Base」または「Abstract」を付けるのですか、それとも単に「Base」を付けるのですか?

以下を検討してください。

タイプ:ViewModel例:MainViewModelReportViewModel

基本クラス:BaseViewModelまたはViewModelBaseまたはAbstractViewModel

次の点も考慮してください。

タイプ:ProductたとえばVirtualProductExpiringProduct

基本クラス:BaseProductまたはProductBaseまたはAbstractProduct

どちらがより標準的だと思いますか?

class Entity : EntityBase
{
}

または

class Entity : BaseEntity
{
}


回答:


90

フレームワークにBaseサフィックスが付いた例がSystem.Configuration.Provider.ProviderBaseありSystem.Web.SessionState.SessionStateStoreProviderBaseます。

ただし、フレームワークのすべての抽象基本クラスがこの規則に従っているわけではありません(たとえばSystem.Data.Common.DbParameterSystem.Data.Common.DbCommand)。

個人的には、抽象クラスであるという事実を強調したくなければ、サフィックスを使用しないでください。そうしないと、クラスのユーザーは名前が具体的な実装を示すと期待するかもしれません。


「クラスがパブリックAPIでの使用を目的としている場合はAvoid、基本クラスにBaseサフィックスを付ける。」フレームワークの設計ガイドライン、174ページ
Yousha Aleayoub

47

上記のどれでもない。基本クラスが提供する目的を検討してください。それに名前を付けます。たとえば、自動車と自転車の基本クラスは車両です。

1つのクラスの基本クラスを持つためだけに基本クラスを作成していて、それ以外の目的や理由がない場合は、おそらく何かが間違っています。


15
これは常に当てはまるわけではなく、フレームワークには多くのBase *クラスがあります。CollectionBase、DictionaryBase ....など
チャドグラント

1
現実世界のオブジェクトがアーティファクトに正確に収まるのが良い点です。コモンズの抽象化はVehicleのようにベースにする必要があります。詳細は後回しにする必要がありますが、正確でもあります。
ruslander 2009年

45
"Base"サフィックスが付いた.NET Frameworkのクラスの一部はバージョン1.0より前に名前が付けられ、Microsoftはこれらの規則に従っていないことに注意してください。しかし、名前を変更することはできません。Microsoftのフレームワーク設計ガイドラインの本のセクション6.2(ベースクラスをカバー)は、特に「ベース」サフィックスを使用しないことを推奨しています。
ウォーレンルマク2012年

5
多くの企業で多くのOO言語で最も頻繁に使用されているのは、「ベース」は、継承のみを目的としており、直接使用することを目的としていない基本クラスを指定するというものです。あなたの例では、「Vehicle」という名前のクラスは、使用および「駆動」できるもののように聞こえます。それ自体が車両であると主張しています。ただし、基本クラスの名前が「Vehicle Parts」、「Vehicle Essentials」、または「Vehicle Kit」の場合、直接使用できるものではなく、さまざまな車両のベースであることがわかります。
Slipp D. Thompson 2014

4
Warrenが述べたように、Microsoftフレームワーク設計ガイドラインの本、基本クラスに関するセクション6.2:msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx 基本サフィックスを避けるように言っています:クラスがパブリックAPIでの使用を目的としている場合は、「Base」サフィックスが付いた基本クラス。」
2016


3

それは選択の問題だと思います。大量の基本クラスを作成している場合は、おそらくBaseClassnameを使用する方が良いと思います。これは、Baseと入力して残りのヘルプを取得するだけで、使用できる基本クラスを常に確認できるためです。 Intellisense。20の基本クラスがあり、接尾辞としてBaseを追加し、基本クラスの名前を忘れた場合はどうなりますか?最初にVSからクラス図を作成し、使用可能な基本クラスを調べますか?クラスが1つまたは2つしかない場合は、ClassBaseという名前を付けてもかまいません。

GetItemsとItemsGet関数の間の決定にも同じことが言えます。読みやすくするために、少なくともGetItemsを使用します。規則に従ってください:)


1
「基本」クラスはオブジェクト指向のハックです。ポールのコメントを参照してください。それらはしばしば役立つものであり、時には必要ですが、それでもハックです。利用可能なすべての基本クラスを探す必要があると感じた場合、それはなぜですか?彼らは何を共有し、それらをすべて一緒に見る必要性を生み出しますか?答えは、より良いネーミングを見つけるのに役立ちます。
Iain 2012

1
@Abhishek:の類推はGetItems機能しません。「Get」は動詞にすぎないため、文法的には接頭辞としてのみ意味がありますが、「Base」は形容詞(接頭辞)または名詞(接尾辞)の両方として機能します。
Slipp D. Thompson、2014

1
@Iain:人々がクラス名に「ベース」を使用する理由は、すべてのベースクラスを見つけることができないためではありません。理論的根拠は逆に近いです。これは、多くの関連クラスの基本クラスがそれらから目立つようにするためです。「I」接頭辞は、それを採用するクラスからインターフェイスを区別することを目的としています。「ベース」の接頭辞/接尾辞は、基本クラスがそれ自体では機能しないときに最も頻繁に使用されることを見てきましたabstract
Slipp D. Thompson 2014

@ SlippD.Thompsonええ、「すべてのクラスを見つける」はAbhishekへの応答でした。私はポールの答えに答えました。
Iain、2014年

2

私たちはBaseEntityを使用していますが、それはあなた自身の好みだと思います。私は頻繁に他を見ます。

プロジェクト、名前空間、または可能であればチームであっても、コンテキスト内で一貫している必要があります。異なる慣習は、悪い慣習の私見よりも悪いです。


2

個人的には、単語ベースを追加しないことをお勧めします。いつコードを変更する必要があるかわからず、コードがベースオブジェクトではなくなります。とは言っても、これは過去に行ったことがあります。前にBaseという単語を付けました。流れが良いようです。


-1

BaseEntityはラクダのケースによく似ています-strName、bseEntity。EntityBaseはサブジェクトを最初に定義するので、機能がより迅速に識別できるようにするために使用します。


10
キャメルケースではなく、ハンガリー語の表記について話しています。ハンガリー語の表記はたまたまキャメルケースになっていますが、まったく別のものです。
sliderhouserules 2010

-5

ものに名前を付けるときは、常にアルファベット順に考えること。私は本当にSQLサーバーを見るのが好きではなく、すべてのストアドプロシージャはusp [something]という名前です。同じように、関数の先頭の名前としてGetとSetを使いすぎないでください。GetItemsまたはPlaceOrderの代わりに、それらにItemsGetまたはOrderPlaceという名前を付けることを検討してください。

したがって、一般的には、ClassnameBase / EntityBaseがより良い選択です。


9
そう思わない; 読みやすさ。GetItemsは、ItemsGetよりもはるかに理にかなっています。
Nathan Ridley、

2
同意しない...上記と同じ理由..しかし、投票することはできません... :(
Mugunth

他のコメントとは異なり、marccはitemgsGet()のようなものを提案していません。彼はitems()を書いた。
Hontváriレベンテ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.