web-dev-qa-db-ja.com

Swiftプロトコルの命名規則

主にc#の背景から来て、動作を定義する実装のないオブジェクトを記述するために「インターフェース」という用語を使用することに慣れています。 C#では、慣習として、IEnumerableなどのように、インターフェイス名の先頭に「I」を付けることになります。

もちろん、コンセプトは言語によって名前が異なります。 Swiftでは、同じ概念を「プロトコル」と呼びます。プロトコルを開発しているとき、プロトコルとそれを実装するクラスの名前がよく似ています。これまでのところ、EnumerableProtocolなどのようにc#で「I」を使用するのと同じ方法で、これらのオブジェクトに「プロトコル」という単語を追加しています。

迅速なプロトコルの命名規則についての考えはありますか?

58
Michael Daw

この回答が書かれて以来、Swiftは長年にわたって大幅に成熟しています。 設計ガイドラインに記載されています

  • what somethingを説明するプロトコルは、名詞として読む必要があります(例:Collection)。

  • capabilityを記述するプロトコルは、サフィックスableible、またはingを使用して名前を付ける必要があります(例:EquatableProgressReporting)。

これを発見してくれて David James に感謝します!

元の回答

なんらかの形式のハンガリー表記法を使用することは、型システム内でエンコードできない重要な概念を表すのに適しています。ただし、一部の識別子がプロトコルを参照しているという事実is Swift(およびC#)の型システムの一部であり、そのため、接頭辞または接尾辞はノイズを追加するだけです明確な接頭辞または接尾辞は、例外やイベントなどの概念に適しています。

Swiftの公式スタイルガイドがない場合は、独自のガイドを用意するか、既存のガイドやコードを借用する必要があります。たとえば、CocoaのObjective-Cスタイルガイドには、次のセクションが含まれています。

クラス名とプロトコル名

プロトコルは、動作をグループ化する方法に従って名前を付ける必要があります。

  • ほとんどのプロトコルは、特にどのクラスにも関連付けられていない関連メソッドをグループ化しています。このタイプのプロトコルは、プロトコルがクラスと混同されないように名前を付ける必要があります。一般的な規則は、動名(「...」)形式を使用することです。

    NSLocking –よし。
    NSLock –悪い(クラスの名前のようです)。

  • 一部のプロトコルは、(いくつかの個別の小さなプロトコルを作成するのではなく)いくつかの無関係なメソッドをグループ化します。これらのプロトコルは、プロトコルの主要な表現であるクラスに関連付けられる傾向があります。これらの場合、規約はプロトコルにクラスと同じ名前を付けることです。

    この種のプロトコルの例は、NSObjectプロトコルです。このプロトコルは、クラス階層内のオブジェクトの位置に関するクエリ、特定のメソッドの呼び出し、参照カウントの増減に使用できるメソッドをグループ化します。 NSObjectクラスはこれらのメソッドの主要な式を提供するため、プロトコルはクラスにちなんで名付けられます。

ただし、2番目のポイントのアドバイスは適用されません。

クラスとプロトコルの名前空間はSwiftで統合されているため、Objective-CのNSObjectプロトコルはSwiftのNSObjectProtocolに再マッピングされます。 ( ソース

ここでは、…Protocolサフィックスは、クラスからプロトコルを明確にするために使用されました。

Swift Standard Library には、プロトコルEquatableComparable、およびPrintableが含まれています。これらは、Cocoaの「…」形式ではなく、「…可能」接尾辞を使用して、このタイプのインスタンスが特定の操作をサポートする必要があることを宣言します。


結論

プロトコルに関連する実装が1つしかないいくつかのケースでは、「…Protocol」サフィックスが意味をなし、クラスとプロトコルに同じ名前を付けることができます。ただし、これはそのような場合にのみ限定されます。

それ以外の場合、名前は、このプロトコルに含まれる操作を反映する名詞である必要があります。動詞の「…」または「…可」の形式を使用することは良い出発点になり得、そのような名前はクラス名と競合する可能性はほとんどありません。

名前EquatableProtocol非推奨です。 EquatableまたはEquatingという名前の方がはるかに優れており、Equatableという名前のクラスはないと思います。この場合、Protocolサフィックスはノイズです。

90
amon