【问题标题】:Naming convention for mutating functions in SwiftSwift 中变异函数的命名约定
【发布时间】:2016-05-30 18:46:06
【问题描述】:

在 Ruby 中,变异方法(即修改 self 的方法)按照惯例用 bang (!) 标记,以将它们与不修改 self 的类似命名方法分开。

例如Array#sort 返回一个排序后的数组,但Array#sort! 修改了调用它的数组。

我现在开始研究 Swift。我如何命名变异方法以将其与非变异双胞胎分开?

我知道 Python 有 sorted(list)list.sort()。这是一个很好的模式吗,即.sorted()(非变异)和.sort()(变异)?

那些不容易以这种方式转换的名称,例如String#next vs String#next!

【问题讨论】:

  • 在 Swift 2 中,sorted()sort() 被重命名为 sort()sortInPlace()
  • 我没想到。我实际上并没有考虑特定的方法,而是尝试寻找一般建议,但找不到任何建议。例如在The Swift Programming Language (Swift 2.1): Extensions section on Mutating Methods 他们使用square() 作为变异方法。
  • 好的,谢谢,提供的链接提供了必要的信息。我在谷歌上搜索该文档中的术语,但不知何故错过了它。 *那些没有副作用的应该读作名词短语,例如。 x.distanceTo(y)i.successor()。 * 那些有副作用的应该读作祈使动词短语,例如,print(x)x.sort()x.append(y)。 * 使用“ed/ing”规则来命名变异方法的非变异对应物,例如x.sort()/x.sorted()x.append(y)/x.appending(y).
  • 在 Swift-Evolution 邮件列表上,他们正在就 Swift 3 的命名约定进行冗长而乏味的讨论。一旦他们确定了答案,他们就会发布 API 命名指南。

标签: swift naming-conventions


【解决方案1】:

关于发布官方指南,这里是: https://swift.org/documentation/api-design-guidelines/#name-according-to-side-effects

名称变异/非变异方法对一致。变异方法通常会有一个具有相似语义的非变异变体,但它会返回一个新值,而不是就地更新实例。

  • 当操作自然地由动词描述时,使用动词的祈使式来表示变异方法,并应用“ed”或“ing”后缀来命名它的非变异对应物。

    Mutating    Nonmutating
    x.sort()    z = x.sorted()
    x.append(y) z = x.appending(y)
    

    更喜欢使用动词的过去 participle(通常附加“ed”)来命名非变异变体:

    /// Reverses `self` in-place.
    mutating func reverse()
    
    /// Returns a reversed copy of `self`.
    func reversed() -> Self
    ...
    x.reverse()
    let y = x.reversed()
    

    当添加“ed”不符合语法时,因为动词有直接宾语,使用动词的现在时 participle 命名非变异变体,并附加“ing”。

    /// Strips all the newlines from `self`
    mutating func stripNewlines()
    
    /// Returns a copy of `self` with all the newlines stripped.
    func strippingNewlines() -> String
    ...
    s.stripNewlines()
    let oneLine = t.strippingNewlines()
    
  • 当操作自然地由名词描述时,使用名词表示非变异方法,并应用“form”前缀来命名它的变异对应物。

    Nonmutating         Mutating
    x = y.union(z)      y.formUnion(z)
    j = c.successor(i)  c.formSuccessor(&i)
    

Ray Wenderlich 总结为自己的Swift Style Guide

动词方法遵循非变异版本的 -ed, -ing 规则
名词方法遵循非变异版本的 formX 规则

请注意,在 2016 年 4 月 18 日批准后,由于 Dave AbrahamsUpdate API Naming Guidelines and Rewrite Set APIs Accordingly 的提议:SE-0059,官方指南已针对 Swift 3 进行了更新。

但五天前,也就是 2016 年 4 月 13 日,Erica Sadun 在她的文章Stop the Madness and fix the Swift API guidelines 中表达了一些不同的观点。让我们补充一下,Erica 之前就此事写了她自己的文章,Naming Methods and Functions,也可以在她的书 Swift Style 中找到。为了好玩,她尝试explain mutating naming with emoji

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多