我真的很不喜欢“魔术数字(Magic Number)”这个说法。我看到很多人都搞错了。我见过不少次 code review,有人一看到代码中的任何数字,就会评论说,"这是一个魔术数字,一定要把它放到文件前面并定义一个名字。"
(我也比较怀疑把所有的变量都放在文件最前面的必要性,这个话题下次再聊)。
我觉得可以在代码中使用各种数字,只是你需要注意操作方式。
什么是魔术数字?
通过谷歌搜索,你可以得到一堆蹩脚的定义,但底线是,一个魔术数字,是你的代码中很难推理的数字。
fun generate() {
for (i in 0 until 52) {
deck[i] = uniqueCard()
}
}
52 是哪里来的?
原来这段代码是要生成一副扑克牌,因为 52 是一副扑克牌的数量,因此我们可以给这个数字起个名字。
const val numberOfCardsInADeck = 52
fun generate() {
for (i in 0 until numberOfCardsInADeck) {
deck[i] = uniqueCard()
}
}
这样就得到可读性更强、可维护性更强的代码。很好,你已经掌握了编写干净代码的方法。
但是,这只是冰山一角。这个例子的问题是,开发者很容易就能从代码的其他部分中找出 52 是什么,这是一个相当