2009-02-22 7 views
10

私はしばしば、インターフェイスまたはクラスによって表される概念を持ち、それを拡張する一連のサブクラス/サブインターフェイスを持っている状況にあります。例えばサブクラスの名前を付けるベストプラクティス

: ジェネリック "DoiGraphNode" A "DoiGraphNode" 等

I関連パスとJavaリソース A "DoiGraphNode" を表すリソース A "DoiGraphNode"、等を表します3つの命名規則を考えることができ、どのように選ぶべきかについてのコメントを感謝するでしょう。


オプション1:常にコンセプトの名前から始めます。したがって

:DoiGraphNode、DoiGraphNodeResource、DoiGraphNodeJavaResource、DoiGraphNodeWithPathなど

プロ:あまり:私が

コンを持っているすべてのオプションを簡単に確認することができ、私が扱っていますどのような非常に明確ですナチュラル?すべて同じに見えますか?


オプション2:最初に特殊なものを入れます。したがって

:などDoiGraphNode、ResourceDoiGraphNode、JavaResourceDoiGraphNode、PathBaseDoiGraphNode、 など、

プロ:私はコードでそれを見るとき、それは非常に明確である

コン:特に、それは難しいかもしれ検索私は名前を覚えていない場合は、視覚的な一貫性の欠如


オプション3:特別なものを入れて、冗長なテキストの一部を削除

したがって:DoiGraphNode、ResourceNode、JavaResourceNode、GraphNodeWithPath

プロ:書き込み、 コンを読むことがそれほどない:他の名前

何が好き

答えて

4

名、それらをオプションよりも、おそらくより一般的であるオプション3を使用して、私の経験から、他の人のコードオプション2を見ています。

名前を付けるのが難しい場合や、あいまいな場合は、クラスがあまりにも多くのことをしているというサインです(単体責任原則)。

名前の競合を回避するには、名前空間を適切に選択します。

Personnally、私は3よりは論理的継承の概念から、次の3

+1

また、3番目のオプションを選択しました。最初の2つには、 "迷いがひどい長い名前の迷路"で終わる危険性があります。あなたはそれらを読んでいて苦労していて、どんな概念に対応しているのかを覚えています。 – starblue

5

使用と競合する可能性があり、非常に矛盾したCr * pを、のように見えます、それは主観的なことです。重要なことは、各クラスが表すものを明確にすることであり、継承関係が意味をなされる名前でなければなりません。私は本当に名前の関係をエンコードすることが重要だとは思わない。それはドキュメンテーションのためのものです(あなたの名前がオブジェクトに適している場合、人々は何から継承しているかについて良い推測をすることができます)。何が価値があるために

は、私は通常、彼らが何のために1

0

オプションを使用すると思います。あなたはインターフェースやクラスを専門に扱っているので、その名前はもはや基本実装(存在する場合)を使用していないことを示すはずです。

クラスが継承するものを見るためのツールが多数あるため、クラスの実際の機能を示す簡潔な名前は、あまりにも多くの型情報を名前にパックしようとするよりも遠くになります。

2

C#hereのIDesignドキュメントなど、コーディング標準のドキュメントにいくつかのガイダンスがあります。

個人的には、私はオプション2を優先します。これは一般に、.NET Frameworkがそのオブジェクトに名前を付ける方法です。たとえば、属性クラスを見てください。それらはすべてAttribute(TestMethodAttribute)で終わります。 EventHandlerについても同じことが言えます。OnClickEventHandlerは、Clickイベントを処理するイベントハンドラーの推奨名前です。

私は通常、自分のコードとインターフェイスを設計する際にこれを実行しようとします。したがって、IUnitWriterはStringUnitWriterとDataTableUnitWriterを生成します。このようにして、私はいつも基本クラスが何であるかを知り、より自然にそれを読み込みます。自己文書化コードはすべてのアジャイル開発者の最終目標ですので、私にとってはうまくいくようです!

1

私は通常、オプションが1に似ていますが、特にクラスがポリモフィックに使用される場合はそうです。 私の推論は、情報の最も重要なビットが最初にリストされているということです。 (つまり、サブクラスは基本的に先祖のものであるという事実、 は(通常)拡張が追加されています)。 クラス名のリストを並べ替えるときには、 という関連するクラスが一緒にリストされるので、このオプションも好きです。 I.私は通常翻訳単位(ファイル名)を と同じ名前にして、関連するクラスファイルが自然に一緒にリストアップされるようにします。 同様に、これはインクリメンタルサーチで便利です。

プログラミングのキャリアで先にオプション2を使用する傾向がありましたが、私はそれを避けるために今は避けていますが、それは「不一致」であり、非常に直交していないと言えるからです。

サブクラスが実質的な拡張または仕様を提供する場合、または名前がかなり長い場合、オプション3を使用することがよくあります。 は、例えば、私のファイルシステム名のクラスは、文字列 由来が、彼らは大幅にStringクラスを拡張し、大幅に異なる 使用/意味を持っている:文字列から派生

Directory_entry_name豊富な機能を追加します。 Directory_entry_nameから派生したFile_nameには、特殊な機能があります。 Directory_entry_nameから派生したDirectory_nameには、やや特殊な機能もあります。

オプション1と一緒に、私は通常、インターフェイスクラスに非修飾名を使用します。 たとえばI、クラスinterence鎖を有するかもしれない。

  • テキスト(インターフェース)
  • Text_abstract(アブストラクト(ベース)一般クラス)
  • Text_ASCII
  • Text_unicode(コーディングASCIIのための特定の具体的なクラス) (ユニコードコーディングに固有の具体的なクラス)

私は、インターフェイスと抽象基本クラスが自動的にソートされたリストの最初に表示されるようにします。

関連する問題