函数式编程复用核心是抽离变化点、稳固通用逻辑,通过高阶函数、工厂函数和函数组合实现声明式、可组合、易测试的代码;需以业务语义命名,避免过度抽象。

函数式编程风格下的代码复用,核心不是“把代码抄一遍再改点”,而是把变化点抽出来、把通用逻辑稳住、让行为可声明、可组合、可替换。
用高阶函数封装变化点
当多个地方逻辑结构一致,仅某一步行为不同(比如判断条件、转换规则、错误处理方式),就该用高阶函数把“变”的部分作为参数传入。
- filter 接收一个 predicate 函数,决定留哪些元素;
- map 接收一个 transform 函数,定义每个元素怎么变;
- reduce 接收一个 reducer 函数,描述如何累积结果。
这样写 orders.filter(isPaid).map(toReceipt),语义直白,不暴露循环或临时变量——你表达的是“要什么”,而不是“怎么做”。
用工厂函数生成定制工具
高阶函数返回新函数,能提前固化配置,产出轻量、专注、可复用的小工具。
-
const startsWith = (prefix) => (str) => str.startsWith(prefix);→data.filter(startsWith('api')); -
const debounce = (ms) => (fn) => { /* 返回防抖后的新函数 */ };; -
const withAuth = (apiCall) => (token, ...args) => apiCall({...args, auth: token});。
这类函数不立即执行,而是按需“造出”一个带上下文的函数,便于测试、组合和跨模块共享。
用函数组合构建声明式流水线
把多个单一职责的纯函数串起来,形成从输入到输出的清晰链条。
- 例如清洗用户数据:
pipe(filter(isActive), map(enrichProfile), sortBy('joinedAt')); - 每步独立:验证、增强、排序互不影响,可单独调试、替换或加日志;
- 调用时只关心输入和最终结果,中间过程被隐藏,意图更聚焦。
组合不是嵌套堆砌,而是让数据自然流过一组可预测、无副作用的处理节点。
守住边界:复用 ≠ 抽象越多越好
函数式复用的价值在于提升表达力,不是堆砌技术概念。
- 函数名优先体现业务意图(
withLoading、retryOnNetworkError),别叫curriedMapper; - 避免三层以上嵌套的 lambda,调试困难且语义模糊;
- 当组合后反而更难读懂,或新人花十分钟才搞懂调用链,说明抽象已越界。
真正好的复用,是别人看一眼调用就知道它在做什么,而不是翻三页源码才明白它怎么做的。


















