C++ 中的 Clean Code:如何编写不羞于展示给同事的代码
每个 C++ 开发者迟早都会遇到这样的情况:自己的代码一个月后变成了“黑暗森林”。像 int a 这样的变量、长达 300 行的函数以及整个项目中的魔法数字——熟悉吗?在本文中,我们将探讨 Clean Code 原则在 C++ 中的应用,使您的代码不仅能够工作,而且对他人(以及未来的您)来说易于理解。
1. 变量、函数和类的命名
好的名字是成功的一半。在 C++ 中,通常对变量和函数使用 camelCase,对类使用 PascalCase,对常量使用 UPPER_CASE(尽管在现代 C++ 中更倾向于使用 constexpr)。
糟糕的例子:
int d; // elapsed time in daysfloat x; // salary multiplierbool fl; // is file loaded?好的例子:
int elapsedDays;float salaryMultiplier;bool isFileLoaded;规则很简单:名字应该回答“这是什么?”或“它做什么?”的问题。避免使用缩写(除非是普遍接受的,例如 idx 表示索引)。对于布尔变量,使用前缀 is、has、can。
2. 函数应该小而精,只做一件事
Clean Code 的经典原则是:一个函数应该只完成一个任务。如果您无法为函数想出一个简短且易懂的名字——很可能它做了太多事情。
糟糕的例子:
void processData(std::vector<int>& data) { // 排序 std::sort(data.begin(), data.end()); // 删除重复项 data.erase(std::unique(data.begin(), data.end()), data.end()); // 计算平均值 double sum = 0; for (int val : data) sum += val; double avg = sum / data.size(); // 输出 std::cout << "Average: " << avg << std::endl;}好的例子:
std::vector<int> sortAndUnique(std::vector<int> data) { std::sort(data.begin(), data.end()); data.erase(std::unique(data.begin(), data.end()), data.end()); return data;}
double calculateAverage(const std::vector<int>& data) { if (data.empty()) return 0.0; double sum = std::accumulate(data.begin(), data.end(), 0.0); return sum / data.size();}
void printAverage(const std::vector<int>& data) { auto processed = sortAndUnique(data); double avg = calculateAverage(processed); std::cout << "Average: " << avg << std::endl;}每个函数解决一个任务,易于测试和重用。函数长度不应超过 20-30 行——这是一个很好的参考标准。
3. 避免魔法数字和重复
魔法数字是指那些从上下文中无法理解其含义的数字。应使用命名常量代替它们。
糟糕的例子:
double calculatePrice(double base) { return base * 1.2 + 5.0;}好的例子:
constexpr double TAX_RATE = 1.2;constexpr double DELIVERY_FEE = 5.0;
double calculatePrice(double basePrice) { return basePrice * TAX_RATE + DELIVERY_FEE;}代码重复也是如此。如果您复制一段代码超过一次——请将其提取到一个函数中。DRY(Don't Repeat Yourself)原则是可维护代码的基础。
4. 注释不是糟糕代码的借口
最好的注释是编写良好的代码,它不需要解释。注释应该解释代码为什么做某些不明显的事情,而不是做什么。
糟糕的例子:
博客
书籍推荐
推荐阅读