为什么使用常量被认为比使用文字更好的编程风格?

时间:2010-12-04 00:00:47

标签: c coding-style

为什么使用常量被认为比使用文字更好的编程风格?先验优于后者的确切优势是什么?

6 个答案:

答案 0 :(得分:14)

一个原因是协助维护。假设你陷入了黑暗时代,你的图形处理程序只适用于1.4M软盘。

你得到了一个处理新奇的2.8M软盘的请求,你想你自己“哈,我只需要搜索代码寻找1440并用2880代替它。简单,嗯?”。

不幸的是,作为一个图形程序,1440也是一英寸的缇数,所以你发现在进行大规模的全局搜索和替换之后,不仅可以处理更大的磁盘,而且所有图像的大小都是错误的屏幕上。 D'哦!

现在你必须回过头来找出那些1440字符串中的磁盘大小和图像大小。

如果您刚刚开发了这样的代码:

#define TWIPS_PER_INCH 1440
#define DISK_SZ 1440

通过在一个地方更改该常量而不影响具有相同值的所有其他常量,您可以更轻松地进行更改。

简短的回答是命名常数会让你的生活变得更轻松。这真的应该是使用它们的理由。

有些极端主义者会坚持认为,你的程序中你应该拥有的唯一硬编码常量是-1,0和1 - 有些会更进一步,但是我们可以打破这个问题:-)我不是那样的但我认为尽可能避免使用它们是个好主意。

我觉得有趣的一件事是那些做以下事情的人:

#define SEVENTY_TWO 72

我并不完全确定他们认为他们正在获得什么,但我实际上已经回应了我在代码审查中对硬编码72做出的评论(我可以笑一下)它现在但我在第二次审查会议上并不高兴。)


另一个原因是使代码更具可读性。除非你有数学背景,否则当你在代码中看到1.414这样的常量时,你将会感到茫然。但是,符号 SQR_ROOT_OF_2可能更容易理解。它与大多数其他常量相同,例如:

SECS_PER_DAY      86400
CUST_ADDR_LINES   7
INVALID_ID        -1
DAYS_PER_CENTURY  36524
PASS_LEVEL        63
MIN_REPUTATION    10000
MAX_LOAN_AMT      200000

您是否希望代码中包含右侧分散的数字,或者您更愿意阅读 intent 更好地呈现的代码?

答案 1 :(得分:2)

因为常量代表一些概念,而不是概念的价值。

例如:

x = 3.14 * 3 ^ 2;

VS

x = PI * RADIUS ^ 2;

第一个是“只是数字”,这可能有任何意义。第二个是等式中的概念,使意图更清晰。

答案 2 :(得分:1)

这很简单 - 您可以分配一次常量并重复使用多次。当您需要更改它时,您可以更改值一次。如果你使用文字,你必须维护它们 - 可能有数百个被遗忘的数字或字符串。

此外,常数的人赋予文字可能缺乏的含义。

答案 3 :(得分:1)

  • 某些常量会发生变化,例如某些变量的初始值或某些内容的最大数量。使用标识符可以让您在任何地方更改常量,只需更改单个声明即可。通常,常数首先仅在一个地方使用,但随着时间的推移可能会在更多地方重复。此外,如果您使用标识符,则可以选择将常量更改为变量,如果您以后需要能够在运行时选择该值。
  • 充当文档。例如,如果您看到if (m > MONTHS_PER_YEAR)而不是if (m > 12),那么您可以推断m代表一个月。 (我通常不会将所有常量命名为MONTHS_PER_YEAR;而m应命名为“month”,以便12的含义变得清晰。)
  • 在PI的情况下,缩短代码,并允许您稍后改变其精度(或强调数字上的“概念”,如Will所说)。

答案 4 :(得分:0)

我认为constansts更好,因为他们的价值观可以改变,所以改变只需要在一个地方。但是,例如#define SEVENTY_TWO 72中的过度使用常量表示一个人的螺丝松动。

答案 5 :(得分:0)

使用常量与“魔术数字”的概念密切相关。不是识别文件的文件,而是那些似乎是由魔法决定的文件。

请考虑以下代码示例:

x = y * 100 / 2;

甚至更糟

x = y * 50;

阅读代码的人如何知道作者的意图是什么?

但如果你这样做:

x = y * CENTS_IN_DOLLAR / NO_OF_PARKING_METERS;
很明显y表示以美元计算的一笔钱,我们试图将它们平均分配在两个停车计时器之间(请原谅我这个非常愚蠢的例子)。

常量应该传达目的,这是最重要的事情要记住:一个不告诉读者它的价值在代码中有什么目的的常数是一个不好的常数。出于同样的原因,将常数重用于不同的目的是一个可怕的想法,甚至比不使用任何目的更糟糕,因为它给人以错误的理解印象。

如果你只想记住一个关于为什么常数有用的词,我会投票给“目的”。