Skip to content

11.2_提取类(Extract_Class)与结构体(Extract_Struct)重构

提取类与结构体,是代码重构中非常实用且强大的技巧!🚀 它可以帮助你将一个庞大、复杂的类拆分成更小、更易于管理的部分。这样做不仅能提高代码的可读性,还能增强代码的复用性。

为什么要提取类与结构体?

当一个类承担了过多的责任时,它就会变得难以理解和维护。这种情况通常被称为“上帝类”。提取类与结构体的主要目的是:

  • 减少类的复杂度:将类的职责分解到多个类中,每个类专注于特定的功能。
  • 提高代码的可读性:更小的类更容易理解,因为它们的代码量更少,职责更清晰。
  • 增强代码的复用性:提取出来的类可以在其他地方被复用,避免代码重复。
  • 方便单元测试:小而专注的类更容易进行单元测试。

如何提取类?

提取类的过程通常包括以下几个步骤:

  1. 识别类的职责:首先,你需要仔细分析这个类,找出它所承担的所有职责。
  2. 确定需要提取的职责:选择一个或多个职责,将它们提取到一个新的类中。
  3. 创建新的类:创建一个新的类,并将提取出来的职责相关的属性和方法移动到这个新类中。
  4. 建立关联关系:在原类和新类之间建立适当的关联关系,例如组合或聚合。
  5. 更新代码:修改原类中的代码,使其使用新类提供的功能。

举个例子,假设你有一个 Order 类,它既负责订单的管理,又负责计算订单的总价。你可以将计算总价的逻辑提取到一个新的 PriceCalculator 类中。

swift
class Order {
    var items: [OrderItem]
    // ... 其他属性和方法

    func calculateTotalPrice() -> Double {
        // 复杂的计算逻辑
        var total: Double = 0
        for item in items {
            total += item.price * Double(item.quantity)
        }
        return total
    }
}

// 重构后
class Order {
    var items: [OrderItem]
    let priceCalculator: PriceCalculator

    init(items: [OrderItem], priceCalculator: PriceCalculator) {
        self.items = items
        self.priceCalculator = priceCalculator
    }

    func calculateTotalPrice() -> Double {
        return priceCalculator.calculate(items: items)
    }
}

class PriceCalculator {
    func calculate(items: [OrderItem]) -> Double {
        var total: Double = 0
        for item in items {
            total += item.price * Double(item.quantity)
        }
        return total
    }
}

结构体的妙用

结构体(Struct)与类非常相似,但它们是值类型,而类是引用类型。在某些情况下,使用结构体可以更好地表达数据的含义,并避免不必要的副作用。

  • 表示简单的数据结构:当你的类主要用于存储数据时,可以考虑使用结构体。
  • 避免共享状态:由于结构体是值类型,每次赋值都会创建一个新的副本,因此可以避免多个对象共享同一份数据。

例如,你可以使用结构体来表示一个坐标点:

swift
struct Point {
    var x: Double
    var y: Double
}

实践中的注意事项

  • 不要过度重构:提取类与结构体应该是有目的的,不要为了重构而重构。
  • 保持代码的简洁性:提取出来的类应该尽可能地简单和专注。
  • 进行充分的测试:在重构之后,务必进行充分的单元测试,确保代码的正确性。

通过合理地运用提取类与结构体的技巧,你可以有效地改善代码的质量,提高开发效率。💪 记住,重构是一个持续的过程,需要不断地学习和实践。祝你编码愉快!🎉

本站使用 VitePress 制作