Skip to main content

oop-vs-fp

面向对象编程与函数式编程的深度对比,分析各自的优势、劣势和适用场景。

소스 정보

저장소
microwind/ai-skills
최근 소스 활동
2026년 4월 2일 05:01
감지된 SKILL.md 언어
중국어
스타
88
포크
24

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
OOP vs FP
description
面向对象编程与函数式编程的深度对比,分析各自的优势、劣势和适用场景。
license
MIT
# OOP vs FP 对比 ## 核心哲学 | 维度 | [OOP](../object-oriented-programming/) | [FP](../functional-programming/) | |------|-----|-----| | 基本单元 | 对象(数据 + 行为) | 函数(输入 → 输出) | | 状态管理 | 可变状态,封装在对象中 | 不可变数据,状态转换 | | 代码复用 | 继承、组合 | 函数组合、高阶函数 | | 多态 | 子类型多态(接口/继承) | 参数多态(泛型) | | 副作用 | 允许,通过封装管理 | 避免,隔离到边界 | | 抽象方式 | 类层次、设计模式 | 类型、函数 | ## 同一问题,两种解法 ### 问题:计算订单总金额(含折扣) ```java // 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); } } ``` ```java // 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); ``` ### 问题:状态机 ```python # 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) ``` ```python # 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 ``` ## 各自的优势场景 ### OOP 更适合 ``` ✅ 复杂业务系统(实体、关系、生命周期) ✅ GUI 应用(组件、事件、状态) ✅ 游戏开发(角色、物品、交互) ✅ 需要丰富类型层次的系统 ✅ 团队以 OOP 为主的项目 ``` ### FP 更适合 ``` ✅ 数据转换管道(ETL、数据处理) ✅ 并发/并行计算(不可变 = 线程安全) ✅ 编译器和解释器 ✅ 数学和科学计算 ✅ 事件处理和流处理 ``` ## 现代趋势:多范式融合 ```java // 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 | 数据转换、并发安全、纯计算 | | 混合 | 大多数现代项目的最佳选择 |
GitHub에서 보기