在 Manus 中运行任何 Skill
一键导入
一键导入
一键在 Manus 中运行任何 Skill
开始使用oop-vs-fp
星标51
分支15
更新时间2026年4月2日 05:01
面向对象编程与函数式编程的深度对比,分析各自的优势、劣势和适用场景。
安装
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
SKILL.md
readonly菜单
面向对象编程与函数式编程的深度对比,分析各自的优势、劣势和适用场景。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
以聚合根为边界,包含多个相关Entity和ValueObject的集合。保证数据一致性和事务边界。
在DDD中具有唯一身份标识和生命周期的对象,通过身份而非属性值相等判断。
封装复杂对象和聚合的创建过程,将创建职责从领域对象中剥离,保证聚合创建时的不变量满足。
没有身份标识,通过属性值判断相等的对象。不可变,通常代表领域中的度量或描述。
命令查询责任分离,将数据的写入操作和读取操作分别用不同的模型处理,优化各自的性能。
将DDD战略设计应用于微服务架构,限界上下文指导服务拆分,领域事件实现服务间通信。
| name | OOP vs FP |
| description | 面向对象编程与函数式编程的深度对比,分析各自的优势、劣势和适用场景。 |
| license | MIT |
| 维度 | OOP | FP |
|---|---|---|
| 基本单元 | 对象(数据 + 行为) | 函数(输入 → 输出) |
| 状态管理 | 可变状态,封装在对象中 | 不可变数据,状态转换 |
| 代码复用 | 继承、组合 | 函数组合、高阶函数 |
| 多态 | 子类型多态(接口/继承) | 参数多态(泛型) |
| 副作用 | 允许,通过封装管理 | 避免,隔离到边界 |
| 抽象方式 | 类层次、设计模式 | 类型、函数 |
// OOP 风格
public class Order {
private List<OrderItem> items;
private DiscountPolicy discount;
public Money calculateTotal() {
Money subtotal = Money.ZERO;
for (OrderItem item : items) {
subtotal = subtotal.add(item.getSubtotal());
}
return discount.apply(subtotal);
}
}
public interface DiscountPolicy {
Money apply(Money amount);
}
public class PercentageDiscount implements DiscountPolicy {
private double rate;
public Money apply(Money amount) {
return amount.multiply(1 - rate);
}
}
// FP 风格
Function<List<OrderItem>, Money> calculateSubtotal =
items -> items.stream()
.map(OrderItem::getSubtotal)
.reduce(Money.ZERO, Money::add);
Function<Money, Money> percentageDiscount(double rate) {
return amount -> amount.multiply(1 - rate);
}
// 组合
Function<List<OrderItem>, Money> calculateTotal =
calculateSubtotal.andThen(percentageDiscount(0.1));
Money total = calculateTotal.apply(orderItems);
# OOP:状态模式
class OrderState(ABC):
@abstractmethod
def next(self, order): pass
class DraftState(OrderState):
def next(self, order):
order.state = PendingState()
class PendingState(OrderState):
def next(self, order):
order.state = ConfirmedState()
class Order:
def __init__(self):
self.state = DraftState()
def advance(self):
self.state.next(self)
# FP:数据 + 纯函数
from enum import Enum
class State(Enum):
DRAFT = "draft"
PENDING = "pending"
CONFIRMED = "confirmed"
transitions = {
State.DRAFT: State.PENDING,
State.PENDING: State.CONFIRMED,
}
def advance(state: State) -> State:
if state not in transitions:
raise ValueError(f"无法从 {state} 前进")
return transitions[state]
# 使用
state = State.DRAFT
state = advance(state) # PENDING
state = advance(state) # CONFIRMED
✅ 复杂业务系统(实体、关系、生命周期)
✅ GUI 应用(组件、事件、状态)
✅ 游戏开发(角色、物品、交互)
✅ 需要丰富类型层次的系统
✅ 团队以 OOP 为主的项目
✅ 数据转换管道(ETL、数据处理)
✅ 并发/并行计算(不可变 = 线程安全)
✅ 编译器和解释器
✅ 数学和科学计算
✅ 事件处理和流处理
// Java:OOP + FP 混合
public class OrderService {
// OOP:对象封装状态和行为
private final OrderRepository repo;
public List<OrderDTO> getActiveOrders(CustomerId customerId) {
return repo.findByCustomerId(customerId)
.stream()
// FP:函数式数据处理
.filter(Order::isActive)
.sorted(Comparator.comparing(Order::getCreatedAt).reversed())
.map(OrderDTO::from)
.collect(toList());
}
}
不是 OOP 或 FP 的二选一,而是:
- 核心业务模型用 OOP(实体、聚合、领域逻辑)
- 数据处理用 FP(Stream、map、filter、reduce)
- 并发控制用 FP(不可变数据)
- 状态管理用 OOP(封装可变状态)
- 两者都要学,灵活运用
| 选择 | 依据 |
|---|---|
| OOP | 复杂对象关系、丰富交互、需要封装状态 |
| FP | 数据转换、并发安全、纯计算 |
| 混合 | 大多数现代项目的最佳选择 |