使用闭包时如何提升函数纯度,优化计数器生成文件名的代码实现
函数纯度优化方案
纯函数的核心要求是相同输入始终返回相同输出、无对外副作用,所以我们只需要把原本藏在函数内部/闭包内的可变状态(counter计数)提取为显式入参,同时将更新后的新状态作为返回值的一部分对外透出,即可实现核心逻辑的纯净化,副作用(状态更新、写入文件)统一移到上层调用侧处理即可。
纯函数版核心实现
/** * 纯函数:根据传入的当前计数生成新文件名和下一次计数 * @param {number} currentCounter 当前已使用的最大计数 * @returns {Object} 生成的文件名和下一次可用计数 */ function createNewFile(currentCounter) { const fileName = `book_${currentCounter}`; return { fileName, nextCounter: currentCounter + 1 }; }
调用示例
副作用(全局计数更新、文件写入)全部收敛到上层调用逻辑,不污染核心纯函数:
// 上层仅负责维护状态,不参与业务逻辑计算 let currentCounter = 0; // 生成第一个文件 const { fileName: firstFileName, nextCounter: firstNext } = createNewFile(currentCounter); currentCounter = firstNext; // 此处执行写入firstFileName的副作用操作 // 生成第二个文件 const { fileName: secondFileName, nextCounter: secondNext } = createNewFile(currentCounter); currentCounter = secondNext; // 此处执行写入secondFileName的副作用操作
优化说明
- 核心的文件名生成、计数递推逻辑完全纯净化,没有任何外部依赖,也不会修改任何外部变量,单元测试只需直接传入固定计数即可验证输出,无需 mock 外部状态
- 副作用(写入文件、全局计数更新)全部收敛到上层调用逻辑,避免了核心业务逻辑被副作用污染
- 如果需要进一步降低上层计数被意外修改的风险,可以将上层计数封装到只读的状态容器中,仅暴露更新计数的专用方法即可
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

