返回
值类型导向编程:突破传统类设计的局限性
IOS
2023-10-22 18:29:14
好的,请稍等片刻,我正在用 AI 螺旋创作器准备您要求的内容。
在 2015 WWDC 大会上,一场具有影响力的会议(面向协议的 Swift 编程)中,Dave Abrahams 通过对类缺点的剖析,阐释了如何用 Swift 的协议来克服这些不足。他提出了这条原则:“不要从类开始,从协议开始”。
Dave 通过一个面向协议的基本的 Stack 类演示了这一思想。这个类由存储数据的数组(称为 elements)和一个用于追踪栈顶元素的属性(称为 top)组成。传统上,这个类会被设计为一个引用类型,以便可以在不复制整个数组的情况下对其进行修改。然而,Dave 指出,使用值类型(struct)同样可以实现这一目标。值类型在每次修改时都会创建新的副本,因此不需要担心改变原始数组。
struct Stack<T> {
private var elements: [T] = []
private var top: Int = -1
mutating func push(_ element: T) {
top += 1
elements.insert(element, at: top)
}
mutating func pop() -> T? {
guard top >= 0 else { return nil }
let element = elements.remove(at: top)
top -= 1
return element
}
var isEmpty: Bool {
return top == -1
}
}
在这个例子中,Stack 是一个值类型,这意味着它在每次修改时都会创建新的副本。因此,我们可以放心地修改栈,而无需担心原始数组受到影响。这使得代码更加简洁和易于维护。
值类型导向编程的优势
值类型导向编程具有许多优势,包括:
- 更灵活: 值类型可以更容易地组合和重用,从而使代码更具灵活性。
- 更简洁: 值类型通常比引用类型更简洁,因为它们不需要显式地管理内存。
- 更可维护: 值类型更易于维护,因为它们的状态是不可变的,不会受到意外的修改。
何时使用值类型
值类型非常适合用于表示不可变的数据,例如字符串、数字和日期。它们也适合用于表示少量的数据,例如一个包含几项数据的结构体。
何时使用引用类型
引用类型非常适合用于表示可变的数据,例如数组、字典和集合。它们也适合用于表示大量的数据,例如一个包含数千项数据的数组。
结论
值类型导向编程是一种强大的范式,可以帮助您编写更灵活、更简洁和更可维护的代码。如果您还没有尝试过值类型导向编程,我鼓励您尝试一下。您可能会惊讶于它能为您带来多大的好处。