OOP 围绕将 可变状态与行为 捆绑在一起的对象来组织代码;Functional Programming (FP) 围绕 纯函数 和 不可变数据 来组织代码,将计算视为数据转换。它们是不同的默认偏好,而非对立面——大多数现代语言都混合使用两者。
| OOP | FP |
|---|
| 单元 | Object(状态 + 方法) | Function |
| 状态 | 封装,通常可变 | 不可变;避免副作用 |
| 多态 | 子类型 / 动态分派 | 高阶函数、泛型 |
| 添加一个 类型 | 容易(新建类) | 困难(修改每个函数) |
| 添加一个 操作 | 困难(修改每个类) | 容易(新建函数) |
最后一行就是 expression problem:每种范式都让一个变化方向容易,另一个方向困难。
# OOP: data + behavior together, dispatch by type
class Circle:
def __init__(self, r): self.r = r
def area(self): return 3.14159 * self.r ** 2
# FP: data is dumb; behavior is a separate pure function
def area(shape):
match shape:
case ("circle", r): return 3.14159 * r ** 2
case ("square", s): return s * s
OOP → rich domains with identity & lifecycle (orders, sessions, UI widgets)
FP → data pipelines, transformations, concurrency (immutability avoids races)
现代语言都是多范式的(Scala、Kotlin、Python、现代 Java/C#),所以实际技能是 根据问题选择合适的工具,而不是选择一个阵营。
FP 对不可变性和纯函数的强调已经重塑了 OOP 最佳实践——不可变值对象和行为依赖注入是源自 FP 的思想,如今已成为良好 OO 设计的标准做法。