如何设计一个好的函数?
TIP
好函数:调用者几乎不用思考,就能正确使用它。
第一原则:语义单一
一个函数应当只回答一个问题,只对一个概念负责。
cpp
// 反例:责任混淆
void process() {
readFile();
parseData();
validate();
saveResult();
}
// 正确做法:
void runPipeline() {
auto data = readFile();
auto parsed = parseData(data);
validate(parsed);
saveResult(parsed);
}- 函数名与行为一致
- 每一步都有清晰语义
- 出问题时定位成本低
第二原则:参数表达必须知道的全部
cpp
// 反例:
void draw(int a, int b, int c);
// 正确做法:
void draw(int width, int height, Color color);- 参数是调用者的使用说明书
第三原则:副作用要显眼
cpp
// 反例:
void update(Config& cfg);
// 正确做法:
void updateConfigFromFile(Config& cfg);副作用越大,名字越长。
第四原则:失败路径要清晰
cpp
// 反例:无法判断失败
void loadData(Data& out);
// 正确做法
bool loadData(Data& out);
Data loadData(); // 用异常
std::optional<Data> loadData();第五原则:优先返回值,慎用输出参数
cpp
// 优先
Result compute(Input in);
// 慎用
void compute(const Input& in, Result& out);- 返回值 → 生命周期清晰、更易组合、测试
- 输出参数 → 调用顺序敏感
函数自检清单
- 函数名能不能当注释用?
- 参数名是否已经解释了用途?
- 调用者是否需要看实现才能用对?
- 副作用是否从名字就能猜到?
- 失败路径是否明确?
- 生命周期是否显而易见?