Convenciones de nomenclatura de protocolos Swift [cerrado]

53

Viniendo de un fondo principalmente de c #, estoy acostumbrado a usar el término "interfaz" para describir un objeto sin implementación que defina el comportamiento. En c #, la convención es anteponer nombres de interfaz con "I", como en IEnumerable, etc.

Por supuesto, el concepto tiene diferentes nombres en diferentes idiomas. En Swift, el mismo concepto se llama "protocolo". Cuando desarrollo protocolos, a menudo tengo nombres muy similares para el protocolo y una clase que lo implementa. Hasta ahora, he agregado la palabra "protocolo" a estos objetos de la misma manera que usaría "I" en C #, como en EnumerableProtocol, etc.

¿Alguna idea sobre una convención de nomenclatura para protocolos en Swift?

Michael Daw
fuente
En general, la terminología utilizada en un nombre de protocolo debe transmitir una habilidad. Equatablelas clases se pueden equiparar, las NSCopyingclases se pueden copiar, etc. La única excepción que viene a la mente son los delegados y las fuentes de datos, que son SomethingDelegateo SomethingDataSource. Creo que la distinción es que las clases propietarias tendrán algo parecido var dataSource: SomethingDataSource, pero no verá algo así var foo: Equatable.
Ben Leggiero

Respuestas:

82

Swift ha madurado significativamente en los años transcurridos desde que se escribió esta respuesta. Las pautas de diseño ahora establecen :

  • Los protocolos que describen qué es algo deben leerse como sustantivos (p Collection. Ej .).

  • Protocolos que describen una capacidad deben nombran usando los sufijos able, ibleo ing(por ejemplo Equatable, ProgressReporting).

¡Gracias a David James por ver esto!

Respuesta original

Usar alguna forma de notación húngara puede ser una buena idea: representar conceptos importantes que no pueden codificarse dentro del sistema de tipos. Sin embargo, el hecho de que algún identificador se refiera a un protocolo es parte del sistema de tipos en Swift (y C #) y, como tal, cualquier prefijo o sufijo solo agrega ruido. Los prefijos o sufijos claros son una mejor idea para conceptos como excepciones o eventos.

En ausencia de una guía de estilo oficial para Swift, tenemos que elaborar la nuestra o pedir prestado las guías o códigos existentes. Por ejemplo, la guía de estilo Objective-C para Cocoa contiene esta sección:

Nombres de clase y protocolo

Los protocolos deben nombrarse de acuerdo con cómo agrupan los comportamientos:

  • La mayoría de los protocolos agrupan métodos relacionados que no están asociados con ninguna clase en particular. Este tipo de protocolo debe nombrarse para que el protocolo no se confunda con una clase. Una convención común es usar una forma de gerundio ("... ing"):

    NSLocking- Bueno.
    NSLock- Pobre (parece un nombre para una clase).

  • Algunos protocolos agrupan varios métodos no relacionados (en lugar de crear varios protocolos pequeños separados). Estos protocolos tienden a estar asociados con una clase que es la expresión principal del protocolo. En estos casos, la convención es dar al protocolo el mismo nombre que la clase.

    Un ejemplo de este tipo de protocolo es el NSObjectprotocolo. Este protocolo agrupa métodos que puede usar para consultar cualquier objeto sobre su posición en la jerarquía de clases, para invocar métodos específicos e incrementar o disminuir su recuento de referencias. Como la NSObjectclase proporciona la expresión principal de estos métodos, el protocolo lleva el nombre de la clase.

Sin embargo, el consejo del segundo punto ya no es aplicable:

Debido a que el espacio de nombres de clases y protocolos está unificado en Swift, el NSObjectprotocolo en Objective-C se reasigna NSObjectProtocolen Swift. ( fuente )

Aquí, el …Protocolsufijo se usó para desambiguar el protocolo de la clase.

La biblioteca estándar Swift contiene los protocolos Equatable, Comparabley Printable. Estos no usan la forma "... ing" de Cocoa, sino el sufijo "... capaz" para declarar que cualquier instancia de este tipo debe admitir una determinada operación.


Conclusión

En algunos casos donde un protocolo solo tiene una implementación relevante, un sufijo "... Protocolo" puede tener sentido para que la clase y el protocolo puedan tener el mismo nombre. Sin embargo, esto debería limitarse solo a tales casos.

De lo contrario, el nombre debe ser algún nombre que refleje qué operaciones contiene este protocolo. Usar un verbo "... ing" o "... capaz" puede ser un buen punto de partida, y es poco probable que tales nombres entren en conflicto con los nombres de clase.

El nombre noEquatableProtocol es recomendable . El nombre Equatableo Equatingsería mucho mejor, y no espero que ninguna clase tenga el nombre Equatable. En este caso, el Protocolsufijo es ruido.

amon
fuente
66
FooDelegate también es común (al menos para los delegados, que casi siempre son protocolos ... tal vez en realidad siempre)
Stripes
3
Según las pautas de diseño de la API de Swift: swift.org/documentation/api-design-guidelines >> Protocolos que describen qué es algo que debe leerse como sustantivos (por ejemplo, Colección). >> Los protocolos que describen una capacidad deben nombrarse utilizando los sufijos able, ible o ing (por ejemplo, Equatable, ProgressReporting).
David James
1
@amon, ¿cómo debo nombrar el protocolo para mi clase BluetoothService o UserDataManager? "... ing" o "... able" no encajan aquí y me gustaría evitar el sufijo "Protocol", ¿alguna idea? De acuerdo con las Pautas de diseño de Api, el protocolo debería ser en este caso un nombre como BluetoothService, pero ¿qué nombre debería tener la implementación? BluetoothServiceImpl? Por cierto. Después de muchos ejemplos que he visto, creo que C # tiene la mejor convección con el prefijo "I" como IAnything, IEquatable, ISmthAware: D
Wojciech Kulik
1
@WojciechKulik No estoy seguro de qué buenos nombres podrían ser en su caso. Mucho depende de cómo se usarán esos protocolos. Sin embargo, ... Los nombres de servicio y ... Administrador pueden ser una especie de olor a código: el nombre es básicamente el mismo si elimina ese sufijo. Algunos nombres a tener en cuenta: Bluetooth, BluetoothConnecting, BluetoothProtocol, UserData, UserDataRepository, UserDataWriting, UserDataProtocol.
amon
1
El nombre de @DeclanMcKenna puede ser bastante subjetivo, y qué nombre elegir no siempre es obvio. Pero en muchos casos, los protocolos deben usarse para expresar una capacidad de alcance estricto (compare también el principio de segregación de interfaz).
amon