抽象クラスの命名規則


101

Microsoftが推し進めたガイドラインでは、抽象クラスに「Base」サフィックスを追加して、抽象クラスであるという事実を未然に防ぐことでした。したがって、のようなクラスがありますSystem.Web.Hosting.VirtualFileBaseSystem.Configuration.ConfigurationValidatorBaseSystem.Windows.Forms.ButtonBase、、そして、もちろんSystem.Collections.CollectionBase

しかし、最近、フレームワークの多くの抽象クラスがこの規則に従っていないように見えました。たとえば、次のクラスはすべて抽象ですが、この規則に従っていません。

  • System.DirectoryServices.ActiveDirectory.DirectoryServer

  • System.Configuration.ConfigurationElement

  • System.Drawing.Brush

  • System.Windows.Forms.CommonDialog

そして、それは私が数秒でドラムアップすることができるものです。それで、私は狂っていないことを確認するために、公式文書が何を言わなければならないか調べました。クラスライブラリを開発するための設計ガイドラインで、 MSDN のクラス、構造体、およびインターフェイス名前を見つけました。奇妙なことに、抽象クラスの名前の最後に「Base」を追加するためのガイドラインについての言及はありません。また、ガイドラインはフレームワークのバージョン1.1では利用できなくなりました。

それで、私はそれを失っていますか?このガイドラインは存在しましたか?それは何の言葉もなく捨てられたのですか?過去2年間、自分で長いクラス名を1つも作成していませんか。

誰かがここで骨を投げます。

更新 私は狂っていません。ガイドラインは存在した。Krzysztof Cwalinaは2005年にそれについて不満を述べています。


あなたがその部分を読んだ場合、Krzysztofは単に「一連の推奨事項」の受け取りについて不満を言うだけであり、必ずしもそれらの推奨事項がマイクロソフトの公式であるとは限らない。私はMSガイドラインを読んで、これに対してこれが推奨されているのを見たことを思い出します。
ジョン・ルディ

1
私はそれを読みましたが、その特定の記事を見たのを思い出すのは初めてです。実際には安心です。私は実際に推薦を好きではありません。これは、これからずっとうなり声をたくさん救います。:)
マイク・ホーファー

回答:




14

そのようなガイドラインは覚えていません。わかりやすい名前を付けるべきだと思います。抽象クラスは、一部のクラスに(ツールとして)共通の機能を提供するためだけに設計されていることがあります。ただし、場合によっては、それをそれ自体では完成しない多態性階層のベースとして使用する必要があります。そのような場合は、通常のクラスのように名前を付けることをお勧めします。

ご覧のとおり、ButtonBaseをパラメータとして受け入れるメソッドはおそらく宣言しません。サブクラスに最小限の機能を提供するように設計されています。ただし、をConfigurationElement異なる形式のエンティティとして扱うこともできますが、それ自体では完全ではありません(したがって、それは抽象です)


11

特に、具体的な実装を作成するために拡張するために具象クラスと抽象クラスの両方を提供する場合は特に、Baseが依然として必要です。
例:ControllerおよびControllerBase(実際にはControllerも抽象的ですが、ControllerBaseよりも大幅に多くの機能を提供します)

インターフェイスに対してプログラミングする場合、ベースサフィックスは醜いので、抽象クラスが主にインターフェイスのように使用されている場合、それを使用しないというMicrosoftのガイドラインが当てはまると思います。おそらく、それらはパブリックAPIで何を意味するのでしょう。

ポイントは、Baseサフィックスを使用するより良い代替手段がない場合があるということです。


4
同意する。さまざまなソースからのコンテンツを解析するフィードシステムで作業しています。パブリックAPI ではIFeedParserという名前のインターフェイスを使用し、内部ではBaseFeedParser
Rui Jarimba

1

ベースサフィックスを避ける傾向を理解していますが、いくつかのサフィックスの必要性も理解しています。現在、この記事のコメントは、「タイプ」をサフィックスとして使用しないことの2番目の選択肢として使用することを提案しています。私はこれは混乱を招くと思いますが、「そのようなコミットメントのない言葉は、それがコミットメントのないクラスであることを示す傾向がある」という考えは私に付きました。

別の方法として:オブジェクトを「指定された人種または家族の、またはそれに属している」と表す接尾辞として「種類」を使用することをお勧めします(ウィクショナリー:-kind)。

例:DataProviderReflectiveDataProvider両方DataProviderKind

たとえば「canis lupus」が「Canoidea」ファミリーに属している生物学に触発され、これは非常に大まかに「犬っぽい」に変換されます。


1

Microsoftは次のように述べています。

https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces

"✓派生クラスの名前を基本クラスの名前で終了することを検討してください。これは非常に読みやすく、関係を明確に説明します。コード内のこの例の一部は、例外の一種であるArgumentOutOfRangeExceptionと、一種の属性です。ただし、このガイドラインを適用する際は、合理的な判断を行うことが重要です。たとえば、ボタンクラスは一種のコントロールイベントですが、名前にコントロールは表示されません。」

一般的に言って、これは名前に「ベース」を使用することを暗黙的に除外します。

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