# 副作用（Side Effect）

### 缩写：无

### 简述

在「得到返回值」之外，对外部环境或程序状态造成的可观察影响，如修改可变状态、读写文件、网络请求、打印日志。带副作用的逻辑更难测试、缓存与并行；完全无副作用的纯计算更易推理，但真实系统必须在边界上产生副作用才能有用。

### 为何出现

程序要与世界交互并记忆状态；纯数学函数不够描述完整系统。

### 使用场景

设计纯函数与非纯边界、测试策略（替身/模拟）、并发下的共享状态分析。

### 实践与应用

• 把副作用推到体系边缘，核心用纯逻辑。
• 明确函数是否承诺无副作用（文档与类型/lint 可辅助）。
• 测试时对副作用边界用替身或集成测试分层。

### 注意事项

• 隐藏副作用（隐式全局、单例可变）是缺陷温床。
• 日志与指标也是副作用，在热路径上有成本。
• 「纯」是相对观察层的：改变可观察行为即副作用。

### 对比与易混

| | 返回值（主结果） | 副作用 |
|--|------------------|--------|
| 是什么 | 交给调用方的结果 | 额外可观察影响 |
| 例子 | `sum` 的数字 | 写文件、改全局、网络、打印 |

### 关联术语

• 纯函数：无副作用且结果仅依赖输入
• 求值：副作用常在求值过程中发生
• 状态：可变状态是副作用的常见载体
• 测试替身：隔离副作用边界时的常用手段
