Convenzioni di denominazione del protocollo Swift [chiuso]


53

Proveniente principalmente da uno sfondo c #, sono abituato a usare il termine "interfaccia" per descrivere un oggetto senza implementazione che definisce il comportamento. In c #, la convenzione è di anteporre nomi di interfaccia con "I", come in IEnumerable, ecc.

Naturalmente, il concetto ha nomi diversi in diverse lingue. In Swift, lo stesso concetto è chiamato "protocollo". Quando sto sviluppando protocolli, ho spesso nomi molto simili per il protocollo e una classe che lo implementa. Finora ho aggiunto la parola "protocollo" a questi oggetti nello stesso modo in cui userei "I" in c #, come in EnumerableProtocol, ecc.

Qualche idea su una convenzione di denominazione per i protocolli in tempi rapidi?



In generale, la terminologia utilizzata nel nome di un protocollo dovrebbe trasmettere un'abilità. Equatablele classi possono essere equiparate, le NSCopyingclassi possono essere copiate, ecc. L'unica eccezione che viene in mente sono i delegati e le origini dati, che sono SomethingDelegateo SomethingDataSource. Penso che la distinzione sia che le classi proprietarie avranno qualcosa di simile var dataSource: SomethingDataSource, ma non vedrai qualcosa di simile var foo: Equatable.
Ben Leggiero,

Risposte:


82

Swift è maturato in modo significativo negli anni da quando questa risposta è stata scritta. Le linee guida di progettazione ora affermano :

  • I protocolli che descrivono cosa è qualcosa devono essere letti come sostantivi (ad es Collection.).

  • I protocolli che descrivono una capacità devono essere denominati con i suffissi able, ibleo ing(per esempio Equatable, ProgressReporting).

Grazie a David James per averlo individuato!

Risposta originale

Usare una qualche forma di notazione ungherese può essere una buona idea: rappresentare concetti importanti che non possono essere codificati all'interno del sistema dei tipi. Tuttavia, il fatto che alcuni identificatori si riferiscano a un protocollo fa parte del sistema di tipi in Swift (e C #), e come tale qualsiasi prefisso o suffisso aggiunge solo rumore. Chiari prefissi o suffissi sono un'idea migliore per concetti come eccezioni o eventi.

In assenza di una guida di stile ufficiale per Swift, dobbiamo inventare la nostra o prendere in prestito da guide o codici esistenti. Ad esempio, la guida di stile Objective-C per Cocoa contiene questa sezione:

Nomi di classi e protocolli

I protocolli dovrebbero essere nominati in base al modo in cui raggruppano i comportamenti:

  • La maggior parte dei protocolli raggruppa metodi correlati che non sono associati ad alcuna classe in particolare. Questo tipo di protocollo deve essere denominato in modo che il protocollo non venga confuso con una classe. Una convenzione comune è quella di utilizzare un modulo gerundio ("... ing"):

    NSLocking- Buono.
    NSLock- Scarso (sembra un nome per una classe).

  • Alcuni protocolli raggruppano una serie di metodi non correlati (piuttosto che creare diversi piccoli protocolli separati). Questi protocolli tendono ad essere associati a una classe che è l'espressione principale del protocollo. In questi casi, la convenzione prevede di assegnare al protocollo lo stesso nome della classe.

    Un esempio di questo tipo di protocollo è il NSObjectprotocollo. Questo protocollo raggruppa metodi che è possibile utilizzare per interrogare qualsiasi oggetto sulla sua posizione nella gerarchia di classi, per fare in modo che invochi metodi specifici e per aumentare o diminuire il conteggio dei riferimenti. Poiché la NSObjectclasse fornisce l'espressione primaria di questi metodi, il protocollo prende il nome dalla classe.

Tuttavia, la consulenza del secondo punto non è più applicabile:

Poiché lo spazio dei nomi di classi e protocolli è unificato in Swift, il NSObjectprotocollo in Objective-C viene rimappato NSObjectProtocolin Swift. ( fonte )

Qui, il …Protocolsuffisso è stato usato per chiarire il protocollo dalla classe.

La libreria standard Swift contiene i protocolli Equatable, Comparablee Printable. Questi non usano il modulo "... ing" di Cocoa, ma piuttosto il suffisso "... capace" per dichiarare che qualsiasi istanza di questo tipo deve supportare una determinata operazione.


Conclusione

In alcuni casi in cui un protocollo ha solo un'implementazione pertinente, un suffisso "... Protocol" può avere senso in modo che la classe e il protocollo possano avere lo stesso nome. Tuttavia, questo dovrebbe essere limitato a tali casi.

Altrimenti, il nome dovrebbe essere un nome che riflette quali operazioni contiene questo protocollo. L'uso di una forma "... ing" o "... capace" di un verbo può essere un buon punto di partenza e è improbabile che tali nomi siano in conflitto con i nomi delle classi.

Il nome EquatableProtocolè non consigliabile . Il nome Equatableo Equatingsarebbe molto meglio, e non mi aspetto che nessuna classe abbia il nome Equatable. In questo caso, il Protocolsuffisso è rumore.


6
Anche FooDelegate è comune (almeno per i delegati, che sono quasi sempre protocolli ... forse in realtà sempre)
Stripes

3
Linee guida per la progettazione dell'API di Swift: swift.org/documentation/api-design-guidelines >> Protocolli che descrivono ciò che qualcosa deve essere letto come sostantivi (ad es. Collection). >> I protocolli che descrivono una capacità dovrebbero essere nominati usando i suffissi in grado, ible o ing (ad esempio Equatable, ProgressReporting).
David James,

1
@amon come devo nominare il protocollo per la mia classe BluetoothService o UserDataManager? "... ing" o "... able" non si adattano qui e vorrei evitare il suffisso "Protocollo", qualche idea? Secondo Api Design Guidelines, in questo caso il protocollo dovrebbe essere un nome come BluetoothService, ma quale nome dovrebbe avere l'implementazione? BluetoothServiceImpl? Btw. dopo molti esempi che ho visto, penso che C # abbia la migliore convinzione con il prefisso "I" come IAnything, IEquatable, ISmthAware: D
Wojciech Kulik

1
@WojciechKulik Non sono sicuro di quali nomi potrebbero essere nel tuo caso. Molto dipende da come verranno utilizzati tali protocolli. Tuttavia, ... Service e ... I nomi dei manager possono essere una sorta di odore di codice - il nome è sostanzialmente lo stesso se si rimuove quel suffisso. Alcuni nomi da considerare: Bluetooth, BluetoothConnect, BluetoothProtocol, UserData, UserDataRepository, UserDataWriting, UserDataProtocol.
amon,

1
La denominazione di @DeclanMcKenna può diventare abbastanza soggettiva e quale nome scegliere non è sempre ovvio. Ma in molti casi i protocolli dovrebbero essere usati per esprimere alcune capacità strettamente mirate (confrontare anche il principio di segregazione dell'interfaccia).
amon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.