返回

值类型导向编程:突破传统类设计的局限性

IOS

好的,请稍等片刻,我正在用 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 是一个值类型,这意味着它在每次修改时都会创建新的副本。因此,我们可以放心地修改栈,而无需担心原始数组受到影响。这使得代码更加简洁和易于维护。

值类型导向编程的优势

值类型导向编程具有许多优势,包括:

  • 更灵活: 值类型可以更容易地组合和重用,从而使代码更具灵活性。
  • 更简洁: 值类型通常比引用类型更简洁,因为它们不需要显式地管理内存。
  • 更可维护: 值类型更易于维护,因为它们的状态是不可变的,不会受到意外的修改。

何时使用值类型

值类型非常适合用于表示不可变的数据,例如字符串、数字和日期。它们也适合用于表示少量的数据,例如一个包含几项数据的结构体。

何时使用引用类型

引用类型非常适合用于表示可变的数据,例如数组、字典和集合。它们也适合用于表示大量的数据,例如一个包含数千项数据的数组。

结论

值类型导向编程是一种强大的范式,可以帮助您编写更灵活、更简洁和更可维护的代码。如果您还没有尝试过值类型导向编程,我鼓励您尝试一下。您可能会惊讶于它能为您带来多大的好处。