ES.45: 避免 "魔法常量"; 用符号常量代替它!#
警告
为了便于读者理解, 将内容尽量适配到了教学大纲所用的 C++98, 因而存在对原文的曲解和言不达意, 有能力请尽量阅读原文.
原因#
嵌在表达式中的、没有命名的常量很容易被忽略且很难理解.
示例#
1for (int m = 1; m <= 12; ++m) { // 糟糕: 魔法常量 12
2 std::cout << month[m] << '\n';
3}
我们不都能看出来循环是在一年里的 12 个月中进行 (从 1 一直迭代到 12).
更好的版本是:
1// 月份是从 1 迭代到 12
2int const first_month = 1;
3int const last_month = 12;
4
5for (int m = first_month; m <= last_month; ++m) { // 更好了
6 std::cout << month[m] << '\n';
7}
更更好的版本是不要暴露常量:
1for (auto m : month) {
2 std::cout << month[m] << '\n';
3}
建议#
检查代码中的所有字面值. 只允许 0
, 1
, '\n'
, ""
这些魔法常量, 其他的魔法常量都应命名.