命名:为什么命名常量在C++/Java中应该全部大写?

2022-09-01 01:17:01

我知道,对于C++和Java来说,这是一个成熟的命名约定,常量应该全部大写,用下划线分隔单词。像这样(Java示例):

public final static Color BACKGROUND_COLOR = Color.WHITE;
public final static Color TEXT_COLOR = Color.BLACK;

这个命名约定很容易理解和遵循,但我问自己,为什么选择这个命名约定而不是变量的常规命名约定:

public final static Color backgroundColor = COLOR.WHITE;
public final static Color textColor = COLOR.BLACK;

似乎没有必要改变常量的外观。如果我们想为它们赋值,编译器无论如何都会阻止这种情况。实际上,它会产生问题,如果以后常量将更改为适当的变量(例如,因为颜色可以配置)。

那么,编写全部大写的命名常量的最终原因是什么呢?历史原因?


答案 1

我认为这不是一个技术问题,而是一个心理问题。命名约定不是由编译器处理的(计算机并不真正介意名称),而是供正在浏览代码的程序员以尽可能少的工作量获得尽可能多的信息。

使用不同的命名约定清楚地告诉读者,您正在阅读的内容在编译时是固定的,您不需要按照代码来确定值到达的位置和方式。


答案 2

我可以想象,最初,在C时代,人们会使用预处理器象征性地实现“常量”:

typedef unsigned int Color;
#define BACKGROUND_COLOR 0xffffff

这样的“常量”只是美化的文本,因此它们的行为并不完全是变量。例如,你不能取这样一个“常量”的地址:

Color *p = &BACKGROUND_COLOR; // Breaks!

出于这个原因,让它们“脱颖而出”是有道理的,因为它们真的不仅仅是“你无法改变的变量”。