.NETのインターフェイスの「I」プレフィックス命名規則の背後にある理由は何ですか?


10

"I"規約がCOM以来存在していたことは知っていますが、.NETが登場する前に他のすべての命名規約のように再検討されなかった理由を理解したことはありません。

消費に関しては、たとえば抽象クラスからインターフェースを分離する唯一のことは、それらが多重継承できることです。しかし、Visual Studio 2003以降のすべてのツールチップには型シグネチャが表示されているため、破棄された他のすべてのハンガリー語の表記と同じくらい役に立ちません。

また、私はそれはあなたが同じ名前を持つインタフェースの基本的な実装を持つことができるようになるかもしれないと思った、例えばMessage継承IMessageが、.NETライブラリのほとんどは(例えば末尾に単語「ベース」を追加するために行っているSystem.Collections.ReadOnlyCollectionBase代わりに) -これはより意味のある意味になります。

COM相互運用機能は別の考えられる理由のようですが、それが生成するラッパークラスが完全に慣用的な.NETであるかのようではないので、それが審美的な考慮事項だったとは思えません。

私の新しいプロジェクトの1つで、私は大会を完全に断念しました。行方不明のものはありますか?


1
あなたはそれらを実現するためにインターフェースを継承しません、大きな違いです。
Daniel Little

また、ListやArrayListではなく、IListやListのような設定のようです。IListはListBaseではなく、実際にはListInterface(型インターフェイスのListではない)であるため、おそらくそれを行いました。
ダニエルリトル

@Lavinski In .NET IListは、シーケンス化された連続したコレクションのランダムアクセスの総称Listですが、シーケンス化された連続的なランダムアクセスの成長するコレクションです。F#はListへのエイリアシングでそれが正しかったと思いますResizeArray。それは間違いなくもっとわかりやすい名前です。IListだったかもしれListないので、それも理由ではないようです。
宮坂玲

2
IBaseBallとIBaseBallBase BaseBallBaseとBaseBallBaseBaseよりも、私には多くの意味があります(愚かな例で、私が知っている:Dを)
電子MEE

@ e-MEEも同様にばかげているIIRCであり、これはIRCチャットプロトコルのインターフェイス、または「正しく覚えている場合」の頭字語です。
宮坂玲

回答:


12

これは、接頭辞が役立つ唯一のケースだと思います。

クラスとインターフェースは実際にはセマンティクスが異なり、どちらも型であるため、簡単に混同できます。
クラス宣言を見ると、それが何から派生していて、何が実装さているかがすぐにわかります

public sealed class ActivityCollection : List<Activity>, 
    IList<Activity>, ICollection<Activity>, IEnumerable<Activity>, 
    IList, ICollection, IEnumerable

定義が次のように見える場合、理解するのは難しいでしょう。

public sealed class ActivityCollection : ListClass<Activity>, 
    List<Activity>, Collection<Activity>, Enumerable<Activity>, 
    List, Collection, Enumerable

そして、あなたはどのように呼びListClassますか?明らかにListBase、それ自体で使用できるからというだけではありません。
したがって、発明したばかりの問題を解決するか、クラスをインターフェイスから分離するプレフィックスを適用する必要があります。

また、個人的には、メソッドシグネチャから、インターフェイスで機能することを知ることができると便利です。

public void PrintLines (IEnumerable<string> source)

それは私の頭の信号のようなものです:ちょっと、これを実装できます!契約に一致するものなら何でもメソッドにフィードできます。

もちろん、それほど重要ではないと主張することもできますが、これは接頭辞を私にとって価値のあるものにする小さなものの1つです。IoCコンテナを使用して多くのコードを記述し、常にインターフェイスを操作していて、2つを簡単に区別する必要がある場合に特に便利です。

ちなみに、.NET型システムでは、インターフェイスだけに接頭辞が付いているわけではありません。ジェネリック型パラメーターを忘れないでください。

public delegate TResult Func<in T, out TResult>(
    T arg
)

これは、クラスと別の種類の型を区別できることが非常に役立つ別の状況です。


2
「第1クラスは継承、第2クラス以降はインターフェース」であることを知ることで簡単に理解できます。
Saeed Neamati 2011

3
これはもっともらしい理由のようです。Javaは、キーワードを使用してリストを明確にすることで、もう少しうまく解決したようですclass Dog extends Mammal implements MailmanChaser。@Saeedは何からも継承しないクラスを持つことができるので、リストの最初の型は実際には基本クラスではなくインターフェースです。
宮坂玲

太字部分の+1。ただし、プレフィックスベースの規則が役立つ別の場所を考えることができます。int[]それは、変更はできるが変更できない(または変更可能なタイプの他のオブジェクト)の排他的所有権をカプセル化するフィールドを区別するためです。共有、およびそれの共有所有権をカプセル化するint[]ものです。そのタイプでは変異が許可されていますが、誰も変異を許可されていません。
スーパーキャット2015年

6

私はあなたが何かを逃したとは思わない、それは単なる歴史的な習慣です。

私もあなたに同意します。また、悪影響を与えることなく、小規模から中規模のいくつかのプロジェクトに「私」をドロップしました。


2
奇妙なのは、彼らがこれ以外のほとんどすべての時代遅れの慣習を捨てたということです。歴史もそれを完全に説明していません。それが本当に内部政治であったのでない限り、私はまだ理由があったに違いないように感じます-しかしそれでも、私が落とされたことについて誰かが怒る理由は本当にわかりません。
宮坂玲

2

Microsoftのインターフェイスとクラスに関する命名ガイドラインによると、唯一の理由は、インターフェイスの名前とそれを実装するクラスの間で競合が発生する場合があるためだと思います。これは、インターフェースが実際には骨格ではなく肉であり、実装者クラスが実際に肉(設計図を実現する)であるという事実に戻ります。したがって、IAnimalは動物を持っているべきかを説明しているだけです、Animalは動物が何を持っているかを教えてくれます。

ただし、インターフェースには単にアニマルベースを使用し、クラスにはアニマルを使用できるという点で、私は個人的に完全に同意します。

一方、2つのことが非常に矛盾している場合があるため、チームはすでに決定したにもかかわらず、さらなる矛盾を防ぐための規則を提供することを決定します。たとえば、ASP.NET MVCでは、部分ビューレイアウト(マスターページ)はどちらも通常のビューと同じですが、機能は異なります。したがって、Microsoftは、名前にアンダースコアを使用しないことを強調しているにもかかわらず、レイアウトパーシャルビューにアンダースコアを付けることを推奨しています。


AnimalInterface代わりに何が問題になっていAnimalBaseますか?これは基本クラスではなく、インターフェースです。
スコットウィットロック2011

3
しかし、AnimalInterfaceではなくIAnimalの何が問題になっていますか?私たちが始めたところまで進んだことを確認してください。これは、「ハンガリー語」の表記のいくつかが有用であることを示しているだけです。それらすべてを(IとTを除いて)捨てるのは、より良いシステムを見つけるための思慮深い試みというよりは、より素晴らしかったです。
gbjbaanb '09 / 09/15

2
@ScottWhitlock:私にとっては、IAnimalよりもずっと読みやすいですAnimalInterface。頻繁に発生する何かに単純な短い規則を使用できる場合を除いて、詳細な名前が望ましいです。そしてインターフェースはそのようなケースです。
maaartinus 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.