Swift协议命名约定


53

来自主要是C#的背景,我习惯于使用术语“接口”来描述对象,而该对象没有定义行为的实现。在c#中,惯例是在接口名称前加上“ I”,如IEnumerable等等。

当然,该概念在不同的语言中具有不同的名称。在Swift中,相同的概念称为“协议”。在开发协议时,我经常为协议和实现它的类有非常相似的名称。到目前为止,我一直在将“ protocol”一词附加到这些对象上,就像在c#中使用“ I”一样,在EnumerableProtocol等等中。

对快速命名协议的约定有何想法?



通常,协议名称中使用的术语应传达一种能力。Equatable类可以相等,NSCopying类可以复制,等等。想到的唯一例外是委托和数据源,它们是SomethingDelegateor SomethingDataSource。我认为区别是所属类会有类似的东西var dataSource: SomethingDataSource,但是您不会看到类似的东西var foo: Equatable
Ben Leggiero

Answers:


82

自从编写此答案以来,Swift已大大成熟。现在,设计准则指出

  • 描述某些事物的协议应读作名词(例如Collection)。

  • 描述一个协议能力应该使用后缀命名ableibleing(例如EquatableProgressReporting)。

感谢大卫·詹姆斯David James)发现这一点!

原始答案

使用某种形式的匈牙利表示法可能是一个好主意-表示无法在类型系统内编码的重要概念。但是,某些标识符引用协议这一事实 Swift(和C#)类型系统的一部分,因此任何前缀或后缀只会增加噪音。对于诸如异常或事件之类的概念,明确的前缀或后缀是一个更好的主意。

在没有Swift的正式样式指南的情况下,我们必须提出自己的指南,或者借鉴现有的指南或代码。例如,可可的Objective-C样式指南包含以下部分:

类和协议名称

协议应根据它们对行为的分组方式来命名:

  • 大多数协议将与方法相关的方法归为一组,这些方法与特定的类无关。应当对这种类型的协议进行命名,以使该协议不会与类混淆。常见的约定是使用gerund(“ ... ing”)形式:

    NSLocking–好。
    NSLock–较差(好像是班级的名称)。

  • 一些协议将许多不相关的方法组合在一起(而不是创建几个单独的小型协议)。这些协议倾向于与作为该协议主要表达的类相关联。在这些情况下,约定是为协议赋予与类相同的名称。

    这种协议的一个示例是NSObject协议。该协议对方法进行了分组,您可以使用这些方法来查询任何对象在类层次结构中的位置,使其调用特定的方法,以及增加或减少其引用计数。因为NSObject该类提供了这些方法的主要表达,所以协议以该类命名。

但是,第二点的建议不再适用:

由于类和协议的名称空间在Swift中是统一的,因此NSObjectObjective-C中的协议NSObjectProtocol在Swift中被重新映射。(来源

在这里,使用…Protocol后缀是为了从类中消除协议的歧义。

雨燕标准库包含了协议EquatableComparablePrintable。它们不使用可可“……”形式,而是使用“……”后缀来声明该类型的任何实例都必须支持某种操作。


结论

在某些协议仅具有一个相关实现的情况下,可以使用“…Protocol”后缀,以便类和协议可以具有相同的名称。但是,这仅应限于此类情况。

否则,名称应为一些名词,以反映此协议包含的操作。使用动词的“…ing”或“…able”形式可能是一个很好的起点,并且此类名称不太可能与类名称冲突。

这个名字EquatableProtocol不值得推荐。名称EquatableEquating会更好,而且我不希望任何班级都使用名称Equatable。在这种情况下,Protocol后缀是噪声。


6
FooDelegate也很常见(至少对于代表来说,这几乎总是协议...也许实际上一直如此)
条纹

3
根据Swift API设计指南:swift.org/documentation/api-design-guidelines >>用于描述应将什么作为名词阅读的协议(例如Collection)。>>描述功能的协议应使用后缀able,ible或ing命名(例如,Equatable,ProgressReporting)。
David James

1
@amon我应该如何为我的类BluetoothService或UserDataManager命名协议?“ ... ing”或“ ... able”不适合此处,我想避免使用“协议”后缀,有什么想法吗?根据Api设计指南,在这种情况下,协议应为类似于BluetoothService的名词,但是应使用什么名称呢?BluetoothServiceImpl?顺便说一句。在我看到许多示例之后,我认为C#具有“ I”前缀的最佳对流方式,例如IAnything,IEquatable,ISmthAware:D
Wojciech Kulik

1
@WojciechKulik我不确定您的情况下可能会使用什么好名字。在很大程度上取决于如何使用这些协议。但是,…服务和…经理名称可能是一种代码味道–如果删除该后缀,则名称基本相同。要考虑的一些名称:Bluetooth,BluetoothConnecting,BluetoothProtocol,UserData,UserDataRepository,UserDataWriting,UserDataProtocol。
阿蒙

1
@DeclanMcKenna的命名可以很主观,选择哪个名称并不总是很明显。但是在许多情况下,应该使用协议来表达一些范围狭窄的功能(还要比较接口隔离原则)。
阿蒙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.