1️⃣ 函数复用优势
(1) 小函数可组合
Point-Free 风格强调将函数拆解成小、纯、单一功能的函数,然后通过函数组合构建复杂逻辑。
示例:
func increment(_ x: Int) -> Int { x + 1 }
func double(_ x: Int) -> Int { x * 2 }
// 通过组合生成新函数
let incrementThenDouble = { double(increment($0)) } // 或使用 compose
let doubleThenIncrement = { increment(double($0)) }
- 小函数
increment、double可独立复用 - 组合方式灵活,不需要重复写逻辑
- 不同组合产生不同行为,而无需修改原函数
(2) 适合函数式流水线
在处理数组或数据流时,Point-Free 风格可以直接把小函数传给高阶函数,如 map、filter:
let numbers = [1, 2, 3]
let result = numbers.map(incrementThenDouble)
- 不显式引用数组元素
- 任何可复用的小函数都可以直接传入
- 流水线高度模块化
✅ 复用性高、可组合性强
2️⃣ 可测试性优势
(1) 小函数易于单元测试
- Point-Free 风格鼓励拆成纯函数
- 纯函数 = 输入 → 输出唯一确定
- 无副作用 → 不依赖外部状态
示例测试:
func testIncrementThenDouble() {
assert(incrementThenDouble(3) == 8)
assert(incrementThenDouble(0) == 2)
}
- 测试简单,不需要设置全局状态
- 不会受到打印、网络或共享变量影响
(2) 流水线可逐段测试
如果函数组合成流水线,可以单独测试每一段:
let numbers = [1, 2, 3, 4]
// 流水线
let processed = numbers
.map(increment) // 测试 increment
.map(double) // 测试 double
assert(processed == [4, 6, 8, 10])
- 每个小函数可独立测试
- 流水线整体易于验证
- 副作用隔离到最外层,测试更可靠
3️⃣ 小结
| 优势 | 说明 |
|---|---|
| 函数复用 | 小函数可组合、不同组合产生不同功能,无需重复逻辑 |
| 可测试性 | 小函数纯净,输入决定输出,无副作用 → 单元测试容易 |
| 组合性强 | 可以直接传给高阶函数或流水线,形成灵活数据处理管道 |
| 维护性高 | 函数逻辑清晰,修改小函数即可影响整个组合,易于扩展 |
💡 经验法则:
采用 Point-Free 风格 → 拆小函数 → 组合逻辑 → 副作用集中 → 测试简单 → 高度复用