Convenções de nomeação de protocolo Swift [fechado]


53

Vindo de um background principalmente em c #, estou acostumado a usar o termo "interface" para descrever um objeto sem implementação que define o comportamento. Em c #, a convenção é acrescentar nomes de interface com "I", como em IEnumerableetc.

Obviamente, o conceito tem nomes diferentes em diferentes idiomas. No Swift, o mesmo conceito é chamado de "protocolo". Quando estou desenvolvendo protocolos, geralmente tenho nomes muito semelhantes para o protocolo e uma classe que o implementa. Até agora, eu anexei a palavra "protocolo" a esses objetos da mesma maneira que usaria "I" em c #, como em EnumerableProtocoletc.

Alguma opinião sobre uma convenção de nomenclatura para protocolos rapidamente?



Em geral, a terminologia usada no nome de um protocolo deve transmitir uma capacidade. Equatableas classes podem ser equiparadas, as NSCopyingclasses podem ser copiadas, etc. A única exceção que vem à mente são delegados e fontes de dados, que são SomethingDelegateou SomethingDataSource. Eu acho que a distinção é que as classes proprietárias terão algo parecido var dataSource: SomethingDataSource, mas você não verá algo parecido var foo: Equatable.
precisa saber é o seguinte

Respostas:


82

Swift amadureceu significativamente nos anos desde que esta resposta foi escrita. As diretrizes de design agora declaram :

  • Protocolos que descrevem o que é algo devem ser lidos como substantivos (por exemplo Collection).

  • Protocolos que descrevem a capacidade deve ser nomeado usando os sufixos able, ibleou ing(por exemplo Equatable, ProgressReporting).

Obrigado a David James por detectar isso!

Resposta original

Usar alguma forma de notação húngara pode ser uma boa idéia - representar conceitos importantes que não podem ser codificados dentro do sistema de tipos. No entanto, o fato de algum identificador se referir a um protocolo faz parte do sistema de tipos no Swift (e C #) e, como tal, qualquer prefixo ou sufixo apenas adiciona ruído. Prefixos ou sufixos claros são uma ideia melhor para conceitos como exceções ou eventos.

Na ausência de um guia de estilo oficial para o Swift, precisamos criar o nosso próprio, ou pedir emprestado aos guias ou códigos existentes. Por exemplo, o guia de estilo Objective-C para cacau contém esta seção:

Nomes de classe e protocolo

Os protocolos devem ser nomeados de acordo com a forma como agrupam comportamentos:

  • A maioria dos protocolos agrupa métodos relacionados que não estão associados a nenhuma classe em particular. Esse tipo de protocolo deve ser nomeado para que o protocolo não seja confundido com uma classe. Uma convenção comum é usar um formulário gerúndio ("... ing"):

    NSLocking- Boa.
    NSLock- Ruim (parece um nome para uma classe).

  • Alguns protocolos agrupam vários métodos não relacionados (em vez de criar vários pequenos protocolos separados). Esses protocolos tendem a estar associados a uma classe que é a principal expressão do protocolo. Nesses casos, a convenção é dar ao protocolo o mesmo nome que a classe.

    Um exemplo desse tipo de protocolo é o NSObjectprotocolo. Este protocolo agrupa métodos que você pode usar para consultar qualquer objeto sobre sua posição na hierarquia de classes, para invocá-lo métodos específicos e para aumentar ou diminuir sua contagem de referência. Como a NSObjectclasse fornece a expressão principal desses métodos, o protocolo é nomeado após a classe.

No entanto, o conselho do segundo ponto não é mais aplicável:

Como o espaço para nome de classes e protocolos é unificado no Swift, o NSObjectprotocolo no Objective-C é remapeado NSObjectProtocolno Swift. ( fonte )

Aqui, o …Protocolsufixo foi usado para desambiguar o protocolo da classe.

A biblioteca padrão Swift contém os protocolos Equatable, Comparablee Printable. Eles não usam o formulário “… ing” do cacau, mas o sufixo “… capaz” para declarar que qualquer instância desse tipo deve suportar uma determinada operação.


Conclusão

Em alguns casos em que um protocolo possui apenas uma implementação relevante, um sufixo "... Protocol" pode fazer sentido para que a classe e o protocolo possam ter o mesmo nome. No entanto, isso deve ser limitado apenas a esses casos.

Caso contrário, o nome deve ser um substantivo que reflita quais operações esse protocolo contém. O uso de uma forma "... ing" ou "... capaz" de um verbo pode ser um bom ponto de partida, e é improvável que esses nomes entrem em conflito com os nomes das classes.

O nome nãoEquatableProtocol é recomendável . O nome Equatableou Equatingseria muito melhor, e eu não espero que nenhuma classe tenha o nome Equatable. Nesse caso, o Protocolsufixo é ruído.


6
FooDelegate também é comum (pelo menos para os delegados, que são quase sempre protocolos ... talvez realmente sempre)
listras

3
De acordo com as diretrizes de design da API Swift: swift.org/documentation/api-design-guidelines >> Protocolos que descrevem o que algo deve ser lido como substantivos (por exemplo, Coleção). >> Os protocolos que descrevem um recurso devem ser nomeados usando os sufixos capazes, compatíveis ou ing (por exemplo, Equatable, ProgressReporting).
David James

11
@amon como devo nomear o protocolo da minha classe BluetoothService ou UserDataManager? "... ing" ou "... enabled" não se encaixa aqui e eu gostaria de evitar o sufixo "Protocol", alguma idéia? De acordo com as Api Design Guidelines, o protocolo deve ser, neste caso, um substantivo como BluetoothService, mas que nome deve ter implementação? BluetoothServiceImpl? Btw. depois de muitos exemplos que eu vi, eu acho que C # tem a melhor convetion com "I" prefixo como IAnything, IEquatable, ISmthAware: D
Wojciech Kulik

11
@WojciechKulik Não tenho certeza de que bons nomes possam ser no seu caso. Depende muito de como esses protocolos serão usados. No entanto,… Os nomes de… Serviço e… Gerente podem ser uma espécie de cheiro de código - o nome é basicamente o mesmo se você remover esse sufixo. Alguns nomes a serem considerados: Bluetooth, BluetoothConnecting, BluetoothProtocol, UserData, UserDataRepository, UserDataWriting, UserDataProtocol.
amon

11
A nomeação @DeclanMcKenna pode ficar bastante subjetiva, e o nome escolhido nem sempre é óbvio. Mas, em muitos casos, os protocolos devem ser usados ​​para expressar alguma capacidade com escopo restrito (compare também o princípio de segregação de interface).
amon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.