Skip to content

如何设计一个好的函数? ​

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);
  • 返回值 → 生命周期清晰、更易组合、测试
  • 输出参数 → 调用顺序敏感

函数自检清单 ​

  1. 函数名能不能当注释用?
  2. 参数名是否已经解释了用途?
  3. 调用者是否需要看实现才能用对?
  4. 副作用是否从名字就能猜到?
  5. 失败路径是否明确?
  6. 生命周期是否显而易见?