副作用(Side Effect)
缩写:无
简述
在「得到返回值」之外,对外部环境或程序状态造成的可观察影响,如修改可变状态、读写文件、网络请求、打印日志。带副作用的逻辑更难测试、缓存与并行;完全无副作用的纯计算更易推理,但真实系统必须在边界上产生副作用才能有用。
为何出现
程序要与世界交互并记忆状态;纯数学函数不够描述完整系统。
使用场景
设计纯函数与非纯边界、测试策略(替身/模拟)、并发下的共享状态分析。
实践与应用
• 把副作用推到体系边缘,核心用纯逻辑。
• 明确函数是否承诺无副作用(文档与类型/lint 可辅助)。
• 测试时对副作用边界用替身或集成测试分层。
注意事项
• 隐藏副作用(隐式全局、单例可变)是缺陷温床。
• 日志与指标也是副作用,在热路径上有成本。
• 「纯」是相对观察层的:改变可观察行为即副作用。
对比与易混
| 返回值(主结果) | 副作用 | |
|---|---|---|
| 是什么 | 交给调用方的结果 | 额外可观察影响 |
| 例子 | sum 的数字 |
写文件、改全局、网络、打印 |
关联术语
• 纯函数:无副作用且结果仅依赖输入
• 求值:副作用常在求值过程中发生
• 状态:可变状态是副作用的常见载体
• 测试替身:隔离副作用边界时的常用手段