it-swarm.com.de

Swift Protocol Naming Conventions

Ich komme hauptsächlich aus dem C # -Hintergrund und bin es gewohnt, den Begriff "Schnittstelle" zur Beschreibung eines Objekts ohne Implementierung zu verwenden, die das Verhalten definiert. In c # besteht die Konvention darin, Schnittstellennamen mit "I" voranzustellen, wie in IEnumerable usw.

Natürlich hat das Konzept unterschiedliche Namen in verschiedenen Sprachen. In Swift wird das gleiche Konzept als "Protokoll" bezeichnet. Wenn ich Protokolle entwickle, habe ich oft sehr ähnliche Namen für das Protokoll und eine Klasse, die es implementiert. Bisher habe ich das Word- "Protokoll" an diese Objekte auf dieselbe Weise angehängt, wie ich "I" in c # verwenden würde, wie in EnumerableProtocol usw.

Irgendwelche Gedanken zu einer Namenskonvention für Protokolle in Kürze?

58
Michael Daw

Swift ist in den Jahren seit dem Schreiben dieser Antwort erheblich gereift. In den Gestaltungsrichtlinien heißt es jetzt :

  • Protokolle, die beschreiben , was etwas ist, sollten als Substantive gelesen werden (z. B. Collection).

  • Protokolle, die eine Fähigkeit beschreiben, sollten mit den Suffixen able, ible oder ing benannt werden (zB Equatable, ProgressReporting).

Vielen Dank an David James , dass Sie dies entdeckt haben!

Ursprüngliche Antwort

Die Verwendung einer ungarischen Notation kann eine gute Idee sein - um wichtige Konzepte darzustellen, die nicht innerhalb des Typsystems codiert werden können. Die Tatsache, dass sich ein Bezeichner auf ein Protokoll bezieht, ist Teil des Typsystems in Swift (und C #)). und als solches fügt jedes Präfix oder Suffix nur Rauschen hinzu. Klare Präfixe oder Suffixe sind eine bessere Idee für Konzepte wie Ausnahmen oder Ereignisse.

In Ermangelung eines offiziellen Styleguides für Swift müssen wir uns einen eigenen einfallen lassen oder ihn aus vorhandenen Anleitungen oder Codes ausleihen. Der Objective-C-Styleguide für Cocoa enthält beispielsweise diesen Abschnitt:

Klassen- und Protokollnamen

Protokolle sollten so benannt werden, wie sie das Verhalten gruppieren:

  • Die meisten Protokolle gruppieren verwandte Methoden, die keiner bestimmten Klasse zugeordnet sind. Dieser Protokolltyp sollte benannt werden, damit das Protokoll nicht mit einer Klasse verwechselt wird. Eine übliche Konvention ist die Verwendung eines Gerundiums ("... ing"):

    NSLocking - Gut.
    NSLock - Schlecht (scheint ein Name für eine Klasse zu sein).

  • Einige Protokolle gruppieren eine Reihe nicht verwandter Methoden (anstatt mehrere separate kleine Protokolle zu erstellen). Diese Protokolle sind in der Regel einer Klasse zugeordnet, die der Hauptausdruck des Protokolls ist. In diesen Fällen besteht die Konvention darin, dem Protokoll den gleichen Namen wie der Klasse zu geben.

    Ein Beispiel für diese Art von Protokoll ist das Protokoll NSObject. Dieses Protokoll gruppiert Methoden, mit denen Sie jedes Objekt nach seiner Position in der Klassenhierarchie abfragen, bestimmte Methoden aufrufen und seinen Referenzzähler erhöhen oder verringern können. Da die Klasse NSObject den primären Ausdruck dieser Methoden bereitstellt, ist das Protokoll nach der Klasse benannt.

Der Rat des zweiten Punktes ist jedoch nicht mehr anwendbar:

Da der Namespace von Klassen und Protokollen in Swift vereinheitlicht ist, wird das Protokoll NSObject in Objective-C in Swift NSObjectProtocol neu zugeordnet. ( Quelle )

Hier die …Protocol Suffix wurde verwendet, um das Protokoll von der Klasse zu unterscheiden.

Die Swift Standard Library Enthält die Protokolle Equatable, Comparable und Printable. Diese verwenden nicht das Cocoa-Formular „… ing“, sondern das Suffix „… able“, um zu deklarieren, dass eine Instanz dieses Typs eine bestimmte Operation unterstützen muss.


Fazit

In einigen Fällen, in denen ein Protokoll nur eine relevante Implementierung hat, kann ein Suffix „… Protokoll“ sinnvoll sein, damit Klasse und Protokoll denselben Namen haben können. Dies sollte jedoch nur auf solche Fälle beschränkt sein.

Andernfalls sollte der Name ein Substantiv sein, das angibt, welche Operationen dieses Protokoll enthält. Die Verwendung einer „… ing“ - oder „… able“ -Form eines Verbs kann ein guter Ausgangspunkt sein, und es ist unwahrscheinlich, dass solche Namen mit Klassennamen in Konflikt stehen.

Der Name EquatableProtocol ist nicht empfehlenswert . Der Name Equatable oder Equating wäre weitaus besser, und ich erwarte nicht, dass eine Klasse den Namen Equatable hat. In diesem Fall ist das Suffix Protocol Rauschen.

90
amon