什么是DRY?
DRY代表:不要重复你自己(Don't Repeat Yourself)
这个编程原则鼓励避免逻辑重复,通过函数/扩展/泛型等Swift工具复用代码。为什么?因为重复代码更难维护,增加bug风险,使代码库混乱难读。让我们通过实际示例看看如何实践DRY。
问题案例
典型的新手错误:
swift
func greetUser(name: String) {
print("Hello, (name)!")
}
func welcomeUser(name: String) {
print("Hello, (name)!")
print("Welcome to our app.")
}
这两个函数有重复逻辑。当需要修改问候语时,必须在两处同时修改,这违反了DRY。
DRY改造版
swift
func greet(name: String) {
print("Hello, (name)!")
}
func welcomeUser(name: String) {
greet(name: name)
print("Welcome to our app.")
}
现在问候逻辑集中在一处,修改时只需改一个函数,代码更易维护。
Swift中的DRY工具
1. 函数封装
改造前:
swift
print("Fetching data...")
// 业务逻辑
print("Fetching data...")
改造后:
swift
func showLoadingMessage() {
print("Fetching data...")
}
showLoadingMessage()
// 业务逻辑
showLoadingMessage()
2. 扩展(Extensions)
日期格式化改造前:
swift
let formatter = DateFormatter()
formatter.dateStyle = .medium
let dateString = formatter.string(from: Date())
改造后:
swift
extension Date {
/// 格式化为本地化中等样式,如"2025年6月5日"
func formattedMedium() -> String {
self.formatted(.dateTime.year().month().day())
}
}
// 使用:
let dateString = Date().formattedMedium()
3. 计算属性
年龄判断改造前:
swift
struct User { let age: Int }
if user.age > 18 { /* 成人逻辑 */ }
guard user.age > 18 else { return }
改造后:
swift
struct User {
let age: Int
var isAdult: Bool { age > 18 }
}
if user.isAdult { /* 成人逻辑 */ }
guard user.isAdult else { return }
4. 泛型(Generics)
数组打印改造前:
swift
func printIntArray(_ array: [Int]) {
array.forEach { print($0) }
}
func printStringArray(_ array: [String]) {
array.forEach { print($0) }
}
改造后:
swift
func printArray<T>(_ array: [T]) {
array.forEach { print($0) }
}
printArray([1, 2, 3]) // 打印Int
printArray(["a", "b", "c"]) // 打印String
5. 协议扩展
日志功能改造前:
swift
class UserViewModel {
func log() { print("UserViewModel log") }
}
class ProductViewModel {
func log() { print("ProductViewModel log") }
}
改造后:
swift
protocol Loggable {
func log()
}
extension Loggable {
func log() {
print("(Self.self) log")
}
}
class UserViewModel: Loggable {}
class ProductViewModel: Loggable {}
userVM.log() // 输出:UserViewModel log
何时应该避免DRY?
DRY也有适用边界:
- 如果合并代码会降低可读性
- 当相似逻辑可能独立变化时
- 少量重复优于过度设计
总结
工具 | 适用场景 | 示例收益 |
---|---|---|
函数封装 | 重复代码段 | 集中修改点 |
扩展 | 添加通用功能 | 日期格式化复用 |
计算属性 | 频繁使用的属性判断 | 业务规则集中管理 |
泛型 | 类型无关的通用操作 | 统一容器处理逻辑 |
协议扩展 | 多类型共享默认实现 | 减少样板代码 |
核心原则 :
✅ 识别重复模式后抽象
✅ 优先使用Swift类型系统
✅ 在简洁性和灵活性间平衡
通过合理运用这些技巧,可以使代码库更健壮、更易维护,同时提升开发效率。记住,DRY不是教条,而是服务于代码质量的工具。