什么是神奇数字?

为什么要避免呢?

有没有合适的情况?


当前回答

你看过维基百科上关于魔法数字的词条了吗?

它详细介绍了魔术数字引用的所有方式。下面是关于魔术数字是一种糟糕的编程实践的引用

“魔数”一词也指在源代码中直接使用数字而不作解释的糟糕编程实践。在大多数情况下,这会使程序更难阅读、理解和维护。尽管大多数指南对数字0和1做了例外处理,但在代码中将所有其他数字定义为命名常量是个好主意。

其他回答

魔术数字也可以是具有特殊的硬编码语义的数字。例如,我曾经看到一个系统,其中记录id > 0被正常对待,0本身是“新记录”,-1是“这是根”,-99是“这是在根中创建的”。0和-99将导致WebService提供一个新的ID。

这样做的不好之处在于,您重用了用于特殊功能的空间(记录id的有符号整数的空间)。也许您永远不希望创建ID为0或ID为负的记录,但即使不是这样,每个查看代码或数据库的人都可能在一开始无意中发现这一点并感到困惑。不用说,这些特殊的值并没有得到很好的记录。

可以说,22、7、-12和620也可以算作神奇数字。: -)

我想这是在回答你之前的问题。在编程中,魔数是一个没有解释就出现的嵌入数字常数。如果它出现在两个不同的位置,则可能导致一个实例被更改而另一个实例未更改的情况。出于这两个原因,在使用数值常数的地方之外隔离和定义数值常数是很重要的。

关于使用神奇数字,还有一个问题没有被提及……

如果你有很多这样的数字,很有可能你有两个不同的目的,你使用魔法数字,其中的值碰巧是相同的。

然后,果然,你需要改变值…只有一个目的。

值得注意的是,有时您确实希望在代码中使用不可配置的“硬编码”数字。有许多著名的,包括0x5F3759DF,它用于优化的平方根反算法。

在极少数情况下,我发现需要使用这种神奇的数字,我将它们设置为我的代码中的const,并记录为什么使用它们,它们是如何工作的,以及它们来自哪里。

@eed3si9n:我甚至认为“1”是一个神奇的数字。: -)

与神奇数字相关的一个原则是,代码处理的每个事实都应该声明一次。如果您在代码中使用神奇的数字(例如@marcio给出的密码长度示例),那么您很容易复制该事实,当您对事实的理解发生变化时,您就会遇到维护问题。