我是一个相当新的程序员,如果这些信息很容易获得,我很抱歉,我还没有找到它.
这是我的问题:
当您使用文字数来访问数组的特定元素时,是否被视为幻数?
例如:
arrayOfNumbers[6] // Is six a magic number in this case?
Run Code Online (Sandbox Code Playgroud)
我问这个问题,因为我的一位教授坚持认为程序中的所有字面数字都是魔数.我只是使用实数访问数组的元素,而不是为每个元素使用命名常量,这将是很好的.
谢谢!
Kor*_*icz 22
这实际上取决于背景.如果您有这样的代码:
arr[0] = "Long";
arr[1] = "sentence";
arr[2] = "as";
arr[3] = "array.";
Run Code Online (Sandbox Code Playgroud)
...然后0..3不被视为魔术数字.但是,如果你有:
int doStuff()
{
return my_global_array[6];
}
Run Code Online (Sandbox Code Playgroud)
...然后6绝对是一个神奇的数字.
这真是太神奇了.
我的意思是,你为什么要访问第6个元素?什么是应该应用于该数字的语义?我们所知道的就是"第6个(从零开始)数字".如果我们知道声明arrayOfNumbers
我们会进一步了解它的类型(例如a int
或a double
).
但如果你说:
arrayOfNumbers[kDistanceToSaturn];
Run Code Online (Sandbox Code Playgroud)
...现在,对于阅读代码的人来说,它有更多的意义.
通常,迭代遍历数组,对每个元素执行一些操作,因为不知道数组有多长,并且您不能以硬编码方式访问它.
然而,有时阵列元素具有特定含义,例如,在图形编程中.有时数组总是大小相同,因为数据需要它(例如某些变换矩阵).在这些情况下,通过数字访问特定元素可能会也可能不会:领域专家会知道你在做什么,但是通才可能不会.为魔术索引编号指定名称会使那些必须维护代码的人更加明显,并帮助您防止意外键入错误的代码.
在我上面的例子中,我假设你的阵列保持从太阳到行星的距离.太阳将是第0个元素,因此arrayOfNumbers [kDistanceToSun] = 0.然后当你递增时,每个元素包含到下一个最远行星的距离:水银,金星等.这比只输入数字更可读.你想要的星球.在这种情况下,阵列具有固定的大小,因为有固定数量的行星(嗯,除了整个冥王星的崩溃).
另一个问题是"arrayOfNumbers"没有告诉我们数组的内容.我们已经知道了它的一系列数字,因为我们在你所说的某个地方看到了声明,int arrayOfNumers[12345];
或者你声明了它.相反,像:
int distanceToPlanetsFromSol[kNumberOfPlanets];
Run Code Online (Sandbox Code Playgroud)
...让我们更好地了解数据实际是什么以及它的语义是什么.作为程序员,您的目标之一应该是编写以这种方式自我记录的代码.
然后我们可以在别处争论是否kNumberOfPlanets
应该是8或9. :)
您应该问问自己为什么要访问该特定职位.在这种情况下,我假设如果你做arrayOfNumbers[6]
第六个位置有一些特殊的意义.如果你认为这意味着什么,你可能会意识到这是隐藏的神奇数字.