如何打造一个让人愉快的框架 - 王巍
onlyUsedInFramework() { ... } public func onlyUsedInFile() { ... } API 设计 命名,是否清晰易懂完整 API 设计 命名,是否清晰易懂完整 清晰明确的命名 // Do this public mutating func removeAt(position: Index) -> Element public func func displayName() -> String // <- none or verb? API 设计 命名,是否清晰易懂完整 尝试为你的方法写注释文档 一句话无法表述清楚这个方法具体做了什么 -> 请考虑重构 理想状态:代码不需要文档就能被看懂 API 设计 命名,是否清晰易懂完整 SWIFT API DESIGN GUIDELINES HTTPS://SWIFT.ORG @testable import YourFramework class FrameworkTypeTests: XCTestCase { // ... } 开发时的选择 命名冲突 // F1.framework extension UIImage { public method() { print("F1") }0 码力 | 84 页 | 21.57 MB | 1 年前3Hello 算法 1.0.0b1 Swift版
我们将这一摞元素的顶部称为「栈顶」,将底部称为「栈底」,将把元素添加到栈顶的操作称为「入栈」,将删除 栈顶元素的操作称为「出栈」。 Figure 5‑1. 栈的先入后出规则 5.1.1. 栈常用操作 栈的常用操作见下表(方法命名以 Java 为例)。 方法 描述 时间复杂度 push() 元素入栈(添加至栈顶) ?(1) pop() 栈顶元素出栈 ?(1) peek() 访问栈顶元素 ?(1) size() 获取栈的长度 而恰好,堆的定义与优先队列的操作逻辑完全吻合,大顶堆就是一个元素从大到小出队的优先队列。从使用角 度看,我们可以将「优先队列」和「堆」理解为等价的数据结构。因此,本文与代码对两者不做特别区分,统 一使用「堆」来命名。 堆的常用操作见下表(方法命名以 Java 为例)。 8. 堆 hello‑algo.com 127 方法 描述 时间复杂度 add() 元素入堆 ?(log ?) poll() 堆顶元素出堆 ?(log 原地排序:只在递归中使用 ?(log ?) 大小的栈帧空间。 非稳定排序:哨兵划分操作可能改变相等元素的相对位置。 自适应排序:最差情况下,时间复杂度劣化至 ?(?2) 。 11.4.3. 快排为什么快? 从命名能够看出,快速排序在效率方面一定“有两把刷子”。快速排序的平均时间复杂度虽然与「归并排序」 和「堆排序」一致,但实际 效率更高,这是因为: ‧ 出现最差情况的概率很低:虽然快速排序的最差时间复杂度为0 码力 | 190 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b2 Swift版
hello‑algo.com 68 Figure 5‑4. 队列的先入先出规则 5.2.1. 队列常用操作 队列的常用操作见下表。需要注意,不同编程语言的方法名是不同的,在这里我们采用与栈相同的方法命名。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) pop() 队首元素出队 ?(1) peek() 访问队首元素 ?(1) 我们可以直接使用编程语言实现好的队列类。 而恰好,堆的定义与优先队列的操作逻辑完全吻合,大顶堆就是一个元素从大到小出队的优先队列。从使用角 度看,我们可以将「优先队列」和「堆」理解为等价的数据结构。因此,本文与代码对两者不做特别区分,统 一使用「堆」来命名。 堆的常用操作见下表,方法名需根据编程语言确定。 8. 堆 hello‑algo.com 127 方法名 描述 时间复杂度 push() 元素入堆 ?(log ?) pop() 堆顶元素出堆 :输入数组完全倒序下,达到最差递归深度 ? 。由于未借助辅助数组空间,因此是“原地排 序”。 非稳定排序:哨兵划分最后一步可能会将基准数交换至相等元素的右边。 11.4.3. 快排为什么快? 从命名能够看出,快速排序在效率方面一定“有两把刷子”。快速排序的平均时间复杂度虽然与「归并排序」 和「堆排序」一致,但实际 效率更高,这是因为: ‧ 出现最差情况的概率很低:虽然快速排序的最差时间复杂度为0 码力 | 199 页 | 15.72 MB | 1 年前3Hello 算法 1.0.0b5 Swift版
图 5‑1 栈的先入后出规则 5.1.1 栈常用操作 栈的常用操作如表 5‑1 所示,具体的方法名需要根据所使用的编程语言来确定。在此,我们以常见的 push()、 pop()、peek() 命名为例。 表 5‑1 栈的操作效率 方法 描述 时间复杂度 push() 元素入栈(添加至栈顶) ?(1) pop() 栈顶元素出栈 ?(1) peek() 访问栈顶元素 ?(1) 通常情 5 章 栈与队列 hello‑algo.com 92 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与 栈相同的方法命名。 表 5‑2 队列操作效率 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) pop() 队首元素出队 ?(1) peek() 访问队首元素 ?(1) 我们可以直接使用编程语言中现成的队列类。 实际上,堆通常用作实现优先队列,大顶堆相当于元素按从大到小顺序出队的优先队列。从使用角度来看, 我们可以将“优先队列”和“堆”看作等价的数据结构。因此,本书对两者不做特别区分,统一使用“堆“来 命名。 堆的常用操作见表 8‑1 ,方法名需要根据编程语言来确定。 表 8‑1 堆的操作效率 第 8 章 堆 hello‑algo.com 170 方法名 描述 时间复杂度 push() 元素入堆0 码力 | 376 页 | 30.70 MB | 1 年前3Hello 算法 1.1.0 Swift版
图 5‑1 栈的先入后出规则 5.1.1 栈的常用操作 栈的常用操作如表 5‑1 所示,具体的方法名需要根据所使用的编程语言来确定。在此,我们以常见的 push()、 pop()、peek() 命名为例。 表 5‑1 栈的操作效率 方法 描述 时间复杂度 push() 元素入栈(添加至栈顶) ?(1) pop() 栈顶元素出栈 ?(1) peek() 访问栈顶元素 ?(1) 通常情 5 章 栈与队列 hello‑algo.com 97 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与 栈相同的方法命名。 表 5‑2 队列操作效率 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) pop() 队首元素出队 ?(1) peek() 访问队首元素 ?(1) 我们可以直接使用编程语言中现成的队列类:0 码力 | 379 页 | 18.47 MB | 1 年前3Hello 算法 1.2.0 简体中文 Swift 版
图 5‑1 栈的先入后出规则 5.1.1 栈的常用操作 栈的常用操作如表 5‑1 所示,具体的方法名需要根据所使用的编程语言来确定。在此,我们以常见的 push()、 pop()、peek() 命名为例。 表 5‑1 栈的操作效率 方法 描述 时间复杂度 push() 元素入栈(添加至栈顶) ?(1) pop() 栈顶元素出栈 ?(1) peek() 访问栈顶元素 ?(1) 通常情 栈与队列 www.hello‑algo.com 97 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与 栈相同的方法命名。 表 5‑2 队列操作效率 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) pop() 队首元素出队 ?(1) peek() 访问队首元素 ?(1) 我们可以直接使用编程语言中现成的队列类:0 码力 | 379 页 | 18.48 MB | 9 月前3Hello 算法 1.0.0 Swift版
图 5‑1 栈的先入后出规则 5.1.1 栈的常用操作 栈的常用操作如表 5‑1 所示,具体的方法名需要根据所使用的编程语言来确定。在此,我们以常见的 push()、 pop()、peek() 命名为例。 表 5‑1 栈的操作效率 方法 描述 时间复杂度 push() 元素入栈(添加至栈顶) ?(1) pop() 栈顶元素出栈 ?(1) peek() 访问栈顶元素 ?(1) 通常情 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与 栈相同的方法命名。 表 5‑2 队列操作效率 第 5 章 栈与队列 hello‑algo.com 98 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) pop() 队首元素出队0 码力 | 378 页 | 17.59 MB | 1 年前3Hello 算法 1.2.0 繁体中文 Swift 版
5‑1 堆疊的先入後出規則 5.1.1 堆疊的常用操作 堆疊的常用操作如表 5‑1 所示,具體的方法名需要根據所使用的程式語言來確定。在此,我們以常見的 push()、pop()、peek() 命名為例。 表 5‑1 堆疊的操作效率 方法 描述 時間複雜度 push() 元素入堆疊(新增至堆疊頂) ?(1) pop() 堆疊頂元素出堆疊 ?(1) peek() 訪問堆疊頂元素 ?(1) 堆疊與佇列 www.hello‑algo.com 97 5.2.1 佇列常用操作 佇列的常見操作如表 5‑2 所示。需要注意的是,不同程式語言的方法名稱可能會有所不同。我們在此採用與 堆疊相同的方法命名。 表 5‑2 佇列操作效率 方法名 描述 時間複雜度 push() 元素入列,即將元素新增至佇列尾 ?(1) pop() 佇列首元素出列 ?(1) peek() 訪問佇列首元素 ?(1)0 码力 | 379 页 | 18.79 MB | 9 月前3
共 8 条
- 1