Code Refactoring
正文
Write Tests first
When faced with an existing piece of code that needs modifying a good refactoring process to follow is:
- Make sure you have tests that verify the current behaviour
- Refactor the code
- Verify that that the behaviour of the code is identical to that before refactoring.
纯函数
一个函数要称为纯函数,通常需要同时满足两个条件。
条件一:相同输入,始终得到相同输出
def square(x):
return x * x
调用多少次:
square(3) # 始终返回 9
函数结果只取决于参数 x,不依赖时间、随机数、全局变量或文件内容。
下面这个函数不是纯函数:
tax_rate = 0.1
def calculate_price(price):
return price * (1 + tax_rate)
虽然它看起来很简单,但结果依赖外部的全局变量 tax_rate。如果全局变量变化,相同的 price 会得到不同结果。
条件二:不产生副作用
副作用指函数除了返回结果,还改变了函数外部可观察的状态,例如:
- 修改全局变量
- 修改传入的可变对象
- 打印内容
- 写文件
- 修改数据库
- 绘图
- 发送网络请求
推荐的程序结构
良好的设计通常把代码分成两部分:
非纯代码:获取输入
↓
纯函数:处理核心逻辑
↓
非纯代码:输出或保存结果
核心思想
纯函数并不是要求整个程序完全没有副作用,而是:
把复杂、关键、需要大量测试的逻辑尽量写成纯函数,把不可避免的输入输出操作限制在少量简单的胶水代码中。