ES.45: 避免 "魔法常量"; 用符号常量代替它!

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', "" 这些魔法常量, 其他的魔法常量都应命名.