函数名中的下划线

23

在很多具有简单面向对象能力的语言中(例如PHP 4),或者被误解为具备面向对象能力的语言(例如Javascript,C使用函数指针等),你最终会得到一个函数命名惯例,使用前导下划线来表示特权级别。

//ex.
function _myPrivateFunction(){
}   

尽管各个团队总是会提出自己的命名约定,但下划线约定似乎是如此普遍,以至于让我对以下两点产生了好奇:

  1. 这种技术最早源自何处
  2. 是否曾经开发出任何标准化系统(类似于匈牙利命名法)来支持这种约定

除了出于纯好奇心外,我现在正在处理一些代码库,并且想要了解最初提出这种方法的开发人员的可能思路。


3
在Python中,双下划线不仅是一种命名惯例,而且实际上会使成员变量私有化! - Christian Davén
5个回答

16
在C++世界中,以下划线开头的成员名称被保留供编译器(或低级STL类似API)开发人员使用。这并不是被编译器以任何方式禁止,而是一种传统惯例。
这个维基链接对下划线非常详细。

8
实际上,所有以下划线开头的名称在全局命名空间中都是保留的,但只有包含双下划线或以下划线和一个大写字母开头的名称在所有上下文中都是保留的。请参见https://dev59.com/KHVC5IYBdhLWcg3woSxW或标准中的17.4.3。 - Steve Jessop
那看起来像是最古老的,所以你赢了。@onebyone,我开始真正理解为什么C++现在会有如此糟糕的声誉了 :) - Alana Storm
我假设下划线维基链接是指编程维基(在添加此链接后加入了消歧义,我想)。 所以应该更改为:https://en.wikipedia.org/wiki/Naming_convention_(programming)? - Joakim

6
我无法告诉你这个约定的起源。我猜测,由于下划线是大多数编程语言中标识符中唯一允许的非字母数字字符,因此选择它作为私有成员的前缀是很自然的。
在Python中,用下划线作为前缀不仅仅是一种约定:以下划线开头的符号在从模块中导入“所有内容”时不会被默认导入,因此下划线表示“私有”/“内部使用”。

3

0

我第一次在编写C++代码时看到这种做法,即使用“m_”前缀标记成员变量。

但是当我编写Java代码时,我更喜欢不使用这种方式。我会使用“this”来清晰地表示成员变量。


在Java中,成员变量会自动标记,因为工具使用静态分析。看看您在任何编辑器中使用的变量颜色!在前面加上“this.”意味着您依赖它来识别。如果您依赖于某个人记住使用“.this”而不是知道变量确切值得机器,那么显然您依赖了错误的指示器。 - Bill K
正确或错误地说,我怀疑有些人仍然使用不能进行良好(或任何)代码分析的文本编辑器编写(或特别是阅读)Java。我试图将语法高亮视为帮助我编辑的工具,而不是其他人如果想要阅读我的代码就需要的东西... - Steve Jessop

0

我曾经看到下划线被用作私有函数,也看到下划线被用作全局函数。此外,在 PHP 中,下划线还用于表示全局变量。

$_POST $_GET $_SESSION etc..

这只是一种命名约定,所以我会问问作者,如果他在的话。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接