2

我有这样的功能:

float_as_thousands_str_with_precision(value, precision)

如果我这样使用它:

float_as_thousands_str_with_precision(volts, 1)
float_as_thousands_str_with_precision(amps, 2)
float_as_thousands_str_with_precision(watts, 2)

那些 1/2s 是神奇的数字吗?

4

3 回答 3

6

是的,它们是神奇的数字。很明显,数字 1 和 2 在代码示例中指定了精度,但没有说明原因。为什么此时需要安培和瓦特比伏特更精确?

此外,避免幻数可以让您集中代码更改,而不是在需要更改精度时为文字数字 2 搜索代码。

我会提出类似的建议:

HIGH_PRECISION = 3;
MED_PRECISION = 2;
LOW_PRECISION = 1;

您的客户端代码如下所示:

float_as_thousands_str_with_precision(volts, LOW_PRECISION )
float_as_thousands_str_with_precision(amps, MED_PRECISION )
float_as_thousands_str_with_precision(watts, MED_PRECISION )

然后,如果将来您执行以下操作:

HIGH_PRECISION = 6;
MED_PRECISION = 4;
LOW_PRECISION = 2;

你所做的就是改变常数......

但是要尝试回答 OP 标题中的问题:

IMO 在迭代、测试长度和大小以及许多数学运算中使用时,唯一可以真正使用且不被视为“魔术”的数字是 -1、0 和 1。使用常量实际上会混淆代码的一些示例:

for (int i=0; i<someCollection.Length; i++) {...}

if (someCollection.Length == 0) {...}

if (someCollection.Length < 1) {...}

int MyRidiculousSignReversalFunction(int i) {return i * -1;}

这些都是非常明显的例子。例如开始和第一个元素并递增一个,测试一个集合是否为空并签名反转......荒谬但作为一个例子。现在用 2 替换所有 -1、0 和 1 值:

for (int i=2; i<50; i+=2) {...}

if (someCollection.Length == 2) {...}

if (someCollection.Length < 2) {...}

int MyRidiculousDoublinglFunction(int i) {return i * 2;}

现在你开始问自己:为什么我要在第 3 个元素上开始迭代并检查其他元素?数字 50 有什么特别之处?包含两个元素的集合有什么特别之处?doubler 示例在这里实际上是有意义的,但您可以看到非 -1、0、1 值 2 和 50 立即变得神奇,因为它们所做的事情显然有些特殊,我们不知道为什么。

于 2012-04-24T19:38:01.673 回答
1

不,他们不是。

在这种情况下,一个神奇的数字将是一个具有无法解释的含义的数字。在您的情况下,它指定了清晰可见的精度。

一个神奇的数字是这样的:

int calculateFoo(int input)
{
  return 0x3557 * input;
}

您应该知道“幻数”这个短语有多种含义。在这种情况下,它在源代码中指定了一个数字,周围环境无法解释。还有其他使用该短语的情况,例如在文件头中,将其标识为某种类型的文件。

于 2012-04-24T19:31:27.513 回答
0

在以下情况下,文字数字不是幻数:

  • 它被使用一次,在一个地方,基于其上下文的非常明确的目的
  • 它以如此普遍的频率和如此有限的上下文使用,以至于被广泛接受为不是魔法(例如,人们经常接受的循环中的+1或-1不是魔法)。
  • 有些人接受零偏移的 +1 不是魔术。我不。当我看到 variable + 1 时,我仍然想知道为什么,ZERO_OFFSET 不会弄错。

至于示例场景:

float_as_thousands_str_with_precision(伏特,1)

并且提议

float_as_thousands_str_with_precision(伏特,HIGH_PRECISION)

如果为同一目的重复使用电压为 1 的函数,则 1 很神奇。那么可以肯定,它是“魔术”,但不是因为含义不清楚,而是因为您只是多次出现。

保罗的回答集中在“无法解释的含义”部分,认为 HIGH_PRECISION = 3 解释了目的。IMO,HIGH_PRECISION 没有提供比 PRECISION_THREE 或 THREE 或 3 更多的解释或价值。当然 3 高于 1,但它仍然没有解释为什么需要更高的精度,或者为什么会有精度差异。这些数字提供了与建议的标签一样多的意图和清晰度。

为什么首先需要不同的精度?作为一名工程人员,我可以假设有三个可能的原因:(a)测量本身仅对 X 精度有效,因此显示应该反映这一点,或者(b)只有足够的显示空间用于 X精度,或者 (c) 观众不会关心高于 X 精度的任何东西,即使它可用。

这些是难以在固定标签中捕捉到的复杂原因,并且可能通过评论更好地服务(解释为什么会做某事)。

如果这些功能的使用在一个地方,而且只在一个地方,我不会认为数字有魔法。意图很明确。

以供参考:

字面数字很神奇

于 2012-04-25T22:08:39.150 回答