翻译@API Design Guidelines(Swift A

2017-05-31  本文已影响2855人  fever105

翻译@API Design Guidelines(Swift API设计指南)


向开发者提供统一完整的使用体验,是Switf 3.0 release的目标之一。其中,API的风格和命名扮演着关键角色。本文通过介绍一系列规范,阐述了开发者如何将自己的代码融入整个Swift生态体系。


目录


基础

如果你发现很难用简单的语言概括API的功能,那么就说明:API的设计可能是错误的。
ℹ️
- **使用Swift内建的Markdown语法**。
- **以对实体的概括作为开头**。通常,用户通过阅读API的声明和概括注释,就可以完全理解其用途。

    ```
    // 返回一个完全相同的'self',只是元素的顺序完全相反
    func reversed() -> ReverseCollection
    ```
    
    ℹ️

    - **专注于概括**,这是注释中最重要的部分。许多注释仅包含高质量的概括,就足以让它们成为优秀的注释。
    - **使用句子中最关键的部分**,如果可以,末尾加上句号。不要使用整句。
    - **描述一个函数或方法做什么,返回什么**,如果什么都不做,或什么都不返回,则略过。

        ```
        /// 把`newHead`插入到`self`的起始位置
        mutating func prepend(_ newHead: Int)
        
        /// 返回一个`List`,以`head`开头,随后是`self`中的元素
        func prepending(_ head: Element) -> List
        
        /// 移除并返回`self`中的第一个元素,如果有的话;否则返回`nil`
        mutating func popFirst() -> Element?
        ```
    
        注意:在极少数情况下,例如上面的`popFirst`,概括由多个句子组成,由分号隔开。
        
    - 描述下标访问的内容:

        ```
        /// 访问第`index`个元素。
        subscript(index: Int) -> Element { get set }
        ```
    - 描述构造函数创建了什么:

        ```
        /// 创建一个包含`n`个`x`的实例。
        init(count n: Int, repeatedElement x: Element)
        ```
        
    - 其他API,描述所声明的实体是什么。

        ```
        /// 一个支持在任意位置同效率插入/移除元素的集合。
        struct List {
        
            /// 位于'self'起始位置的元素,如果'self'为空,则为'nil'
            var first: Element?
        }
        ```
- 此外,也可以继续添加一段或多段讨论,同时罗列要点。段落由空行隔开,使用整句。

    ```
    /// 将`items`中每个元素的文字表示写入标准输出。
    ///
    /// 每个元素`x`的文字表示通过表达式`String(x)`生成。
    ///
    ///
    /// - 参数 separator: 两项之间的文字
    /// - 参数 terminator: 末尾的文字
    ///
    /// - 注意: 想要省略末尾的换行符,为`terminator`传入""
    ///
    /// - 其他参考: `CustomDebugStringConvertible`, `CustomStringConvertible`, `debugPrint`。
    public func print(_ items: Any..., separator: String = " ", terminator: String = "\n")
    ```
    
     ℹ️
     
     - 使用公认的[文档符号标记元素](https://developer.apple.com/library/prerelease/mac/documentation/Xcode/Reference/xcode_markup_formatting_ref/SymbolDocumentation.html#//apple_ref/doc/uid/TP40016497-CH51-SW1),为注释添加概括以外的信息。
     - 了解[符号命令语法](https://developer.apple.com/library/prerelease/mac/documentation/Xcode/Reference/xcode_markup_formatting_ref/SymbolDocumentation.html#//apple_ref/doc/uid/TP40016497-CH51-SW13),使用公认的项目符号。当下流行的开发工具,例如Xcode,对以下面关键字开头的项目符号做特殊处理:
Attention Author Authors Bug
Complexity CopyRight Date Experiment
Important Invariant Note Parameter
Parameters Postcondition Precondition Remark
Requires Returns SeeAlso Since
Throws Todo Version Warning

命名

意图清晰


力求流畅

        可变方法  | 不可变方法
        ------------- | -------------
        x.sort()  | z = x.sorted()
        x.append(y)  | z = x.appending(y)

        
        ℹ️
        
        - 命名不可变方法,最好使用过去分词,即后缀"ed":

            ```
            /// 原地倒序`self`
            mutating func reverse()
            
            /// 返回一个倒序后的`self`的副本
            func reversed() -> Self
            ...
            x.reverse()
            let y = x.reversed()
            ```
        
        - 如果由于动词后面直接跟名词,无法添加"ed"时,则使用现在分词命名不可变方法,即后缀"ing"。

            ```c
            /// 移除`self`中的所有换行符
            mutating func stripNewlines()
            
            /// 返回一个`self`副本,移除了所有换行符
            func strippingNewlines() -> String
            ...
            s.stripNewlines()
            let oneLine = t.strippingNewlines()
            ```
        
    - 当一项操作恰好能够被一个名词描述时,使用名词为不可变方法命名;加前缀"form",为可变方法命名。

        可变方法 |不可变方法 
        ------------- | -------------
        y.formUnion(z) | x = y.union() 
        c.formSuccessor(&i) | j = c.successor(i)

慎用术语

Term of Art 名词 - 在某个领域或行业内,有着明确特殊含义的词或短语。


惯例

一般惯例


形参

func move(from start: Point, to end: Point)

实参标签

func move(from start: Point, to end: Point)
x.move(from: x, to: y)
>值保留类型转换是[单态](https://en.wikipedia.org/wiki/Monomorphism),即一个值对应一个结果。例如,将一个`Int8`值转换为一个`Int64`值属于这种操作,因为不同的`Int8`值都对应不同的`Int64`值。反过来就不是:`Int64`可能的值要比`Int8`能够表示的值多得多。

注意:能否追溯原始值,同是不是值保留类型转换没有联系。

特别说明

上一篇 下一篇

猜你喜欢

热点阅读