Issu d'un arrière-plan principalement c #, j'ai l'habitude d'utiliser le terme "interface" pour décrire un objet sans implémentation qui définit le comportement. En c #, la convention consiste à ajouter les noms d'interface avec "I", comme dans IEnumerable
, etc.
Bien sûr, le concept a des noms différents dans différentes langues. Dans Swift, le même concept est appelé "protocole". Lorsque je développe des protocoles, j'ai souvent des noms très similaires pour le protocole et une classe qui l'implémente. Jusqu'à présent, j'ai ajouté le mot "protocole" à ces objets de la même manière que j'utiliserais "I" en c #, comme dans EnumerableProtocol
, etc.
Avez-vous des idées sur une convention de dénomination pour les protocoles en swift?
Swift a mûri de manière significative au cours des années qui ont suivi la rédaction de cette réponse. Les directives de conception indiquent maintenant :
Les protocoles qui décrivent ce que quelque chose doit être lu comme des noms (par exemple
Collection
).Les protocoles décrivant une capacité doivent être nommés à l'aide des suffixes
able
,ible
ouing
(par exempleEquatable
,ProgressReporting
).
Merci à David James d'avoir repéré cela!
L'utilisation d'une certaine forme de notation hongroise peut être une bonne idée - pour représenter des concepts importants qui ne peuvent pas être encodés dans le système de type. Cependant, le fait qu'un identifiant se réfère à un protocole fait partie du système de type dans Swift (et C #) , et en tant que tel, tout préfixe ou suffixe n'ajoute que du bruit. Les préfixes ou suffixes clairs sont une meilleure idée pour des concepts tels que les exceptions ou les événements.
En l'absence d'un guide de style officiel pour Swift, nous devons trouver le notre, ou emprunter aux guides ou au code existants. Par exemple, le guide de style Objective-C pour Cocoa contient cette section:
Noms de classe et de protocole
Les protocoles doivent être nommés en fonction de la façon dont ils regroupent les comportements:
La plupart des protocoles regroupent des méthodes liées qui ne sont associées à aucune classe en particulier. Ce type de protocole doit être nommé afin que le protocole ne soit pas confondu avec une classe. Une convention courante consiste à utiliser un formulaire gérondif ("... ing"):
NSLocking
- Bien.NSLock
- Pauvre (ressemble à un nom pour une classe).Certains protocoles regroupent un certain nombre de méthodes non liées (plutôt que de créer plusieurs petits protocoles distincts). Ces protocoles ont tendance à être associés à une classe qui est la principale expression du protocole. Dans ces cas, la convention est de donner au protocole le même nom que la classe.
Un exemple de ce type de protocole est le protocole
NSObject
. Ce protocole regroupe les méthodes que vous pouvez utiliser pour interroger un objet sur sa position dans la hiérarchie des classes, pour lui faire appeler des méthodes spécifiques et pour incrémenter ou décrémenter son nombre de références. Étant donné que la classeNSObject
fournit l'expression principale de ces méthodes, le protocole est nommé d'après la classe.
Cependant, l'avis du deuxième point n'est plus applicable:
Étant donné que l'espace de noms des classes et des protocoles est unifié dans Swift, le protocole
NSObject
dans Objective-C est remappé surNSObjectProtocol
dans Swift. ( source )
Ici le …Protocol
le suffixe a été utilisé pour lever l'ambiguïté du protocole de la classe.
Swift Standard Library contient les protocoles Equatable
, Comparable
et Printable
. Ceux-ci n'utilisent pas le formulaire "… ing" de Cocoa, mais plutôt le suffixe "… able" pour déclarer que toute instance de ce type doit prendre en charge une certaine opération.
Dans quelques cas où un protocole n'a qu'une seule implémentation pertinente, un suffixe "… Protocol" peut avoir un sens afin que la classe et le protocole puissent avoir le même nom. Cependant, cela ne devrait être limité qu'à de tels cas.
Sinon, le nom doit être un nom reflétant les opérations contenues dans ce protocole. L'utilisation d'un verbe "… ing" ou "… capable" peut être un bon point de départ, et il est peu probable que de tels noms entrent en conflit avec les noms de classe.
Le nom EquatableProtocol
est déconseillé . Le nom Equatable
ou Equating
serait bien mieux, et je ne m'attends pas à ce qu'une classe ait le nom Equatable
. Dans ce cas, le suffixe Protocol
est noise.