11.2_提取类(Extract_Class)与结构体(Extract_Struct)重构
提取类与结构体,是代码重构中非常实用且强大的技巧!🚀 它可以帮助你将一个庞大、复杂的类拆分成更小、更易于管理的部分。这样做不仅能提高代码的可读性,还能增强代码的复用性。
为什么要提取类与结构体?
当一个类承担了过多的责任时,它就会变得难以理解和维护。这种情况通常被称为“上帝类”。提取类与结构体的主要目的是:
- 减少类的复杂度:将类的职责分解到多个类中,每个类专注于特定的功能。
- 提高代码的可读性:更小的类更容易理解,因为它们的代码量更少,职责更清晰。
- 增强代码的复用性:提取出来的类可以在其他地方被复用,避免代码重复。
- 方便单元测试:小而专注的类更容易进行单元测试。
如何提取类?
提取类的过程通常包括以下几个步骤:
- 识别类的职责:首先,你需要仔细分析这个类,找出它所承担的所有职责。
- 确定需要提取的职责:选择一个或多个职责,将它们提取到一个新的类中。
- 创建新的类:创建一个新的类,并将提取出来的职责相关的属性和方法移动到这个新类中。
- 建立关联关系:在原类和新类之间建立适当的关联关系,例如组合或聚合。
- 更新代码:修改原类中的代码,使其使用新类提供的功能。
举个例子,假设你有一个 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
}实践中的注意事项
- 不要过度重构:提取类与结构体应该是有目的的,不要为了重构而重构。
- 保持代码的简洁性:提取出来的类应该尽可能地简单和专注。
- 进行充分的测试:在重构之后,务必进行充分的单元测试,确保代码的正确性。
通过合理地运用提取类与结构体的技巧,你可以有效地改善代码的质量,提高开发效率。💪 记住,重构是一个持续的过程,需要不断地学习和实践。祝你编码愉快!🎉