Mne*_*nth 33 c++ java naming-conventions
我知道,对于C++和Java来说,它是一个完善的命名约定,常量应该全部写成大写,并用下划线来分隔单词.像这样(Java示例):
public final static Color BACKGROUND_COLOR = Color.WHITE;
public final static Color TEXT_COLOR = Color.BLACK;
Run Code Online (Sandbox Code Playgroud)
这个命名约定很容易理解和遵循,但我问自己,为什么选择这个命名约定而不是变量的常规命名约定:
public final static Color backgroundColor = COLOR.WHITE;
public final static Color textColor = COLOR.BLACK;
Run Code Online (Sandbox Code Playgroud)
似乎没有必要改变常量的外观.如果我们想为它们分配一个值,编译器将会阻止它.实际上它会产生问题,如果以后将常量变为适当的变量(因为颜色可以配置为例如).
那么将命名常量全部写成大写的最终原因是什么?历史原因?
Dav*_*eas 31
我认为这不是技术问题,而是心理问题.命名约定不是由编译器处理(计算机并不真正关注名称),而是为浏览代码的程序员提供尽可能多的信息,只需要尽可能少的努力.
使用不同的命名约定清楚地告诉读者,您正在阅读的内容是在编译时固定的内容,您无需通过代码来确定值的位置和方式.
Jon*_*eet 17
如果我知道某些东西是常数,我可以多次引用它并知道它不会改变.换句话说,我知道:
Color black = Colors.BLACK;
foo(black);
foo(black);
Run Code Online (Sandbox Code Playgroud)
是相同的:
foo(Colors.BLACK);
foo(Colors.BLACK);
Run Code Online (Sandbox Code Playgroud)
有时候知道这很有用.我个人更喜欢.NET命名约定,即使用Pascal case作为常量(和方法):
Foo(Colors.Black);
Foo(Colors.Black);
Run Code Online (Sandbox Code Playgroud)
我不是一个狡猾的案例的忠实粉丝......但我确实认为常数显然是常数.
unw*_*ind 16
我可以想象,最初,在C日,人们将使用预处理器象征性地实现"常量":
typedef unsigned int Color;
#define BACKGROUND_COLOR 0xffffff
Run Code Online (Sandbox Code Playgroud)
这样的"常量"只是美化文字,因此它们不像变量那样表现.例如,你不能接受这种"常数"的地址:
Color *p = &BACKGROUND_COLOR; // Breaks!
Run Code Online (Sandbox Code Playgroud)
出于这个原因,让它们"脱颖而出"是有道理的,因为它们不仅仅是"你无法改变的变量".
Tim*_*sch 12
我相信C++这是一个从使用预处理器到#define常量值的过程.那时候,我们这样做是为了避免让预处理器践踏你的源代码,因为C函数和变量名的通常约定会使它们混合大小写或小写.
从C++的角度来看,我会说让你的常量全部大写是一个坏主意.由于这个原因,我不得不调试多个构建问题 - 请记住,C++预处理器对名称空间和命名范围一无所知,并且很乐意替换它认为合适的内容,即使它是不合适的.
我认为大写常量是 C 的糟糕遗产。背后的逻辑与使用下划线作为私有成员前缀时的逻辑相同。这是技术性的东西,已经用 Java 关键字表达了,例如,private或者,在常量的情况下,static final。
在C(然后是C++)中,使用预处理器#define指令定义的符号全部用大写字母写成,向开发人员发出一个响亮的信号,即代码不像它看起来那样并且不被视为普通符号.常量最初并不存在于K&R C中(虽然const后来从C++中恢复),因此开发人员使用了它#define,因此使用了大写字母.
出于某种原因,这被扭曲成Java,因为"常数是上限",因此当前误导(IMO)惯例.
实际上,大多数 C++ 命名指南(包括 ISO、Boost、Sutter & Stroustrup 和 Google)强烈反对使用全部大写的命名常量。这是因为宏也使用全部大写,并且它们可能散布在头文件中,可能会产生奇怪的行为。无论如何,人们仍然使用全部大写,因为他们从旧的 C/K&R 或旧的遗留代码中学习。然而,在现代 C++ 新代码中,您应该避免对除宏之外的任何内容使用全部大写。
我对为什么全部大写存在的宠物理论是,在非常旧的机器上,代码是使用数字键盘直接在机器代码中输入的。当汇编语言出现时,它只使用全部大写,因为当时的键盘尚未标准化,并且某些键盘受到限制,例如,使用与功能手机相同的数字键盘来输入字母。这后来被延续到许多早期语言,比如 BASIC,它涵盖了一切。当实际的终端可用并且键盘开始标准化时,人们开始毫无保留地使用混合大小写,并且所有大写字母都被保留给那些很少出现的东西,例如与函数和变量相比的常量。
大多数 C++ 指南现在都同意使用“k”作为常量的前缀,后跟带有下划线或驼峰命名法的名称。我个人更喜欢 kCameCase,因为它可以轻松区分使用下划线命名的变量。
const float kFixedRadius = 3.141;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32748 次 |
| 最近记录: |