在标准类型和用户定义类型之间进行语法区分的目的是什么?


13

尽管在这里我将特别提及C ++和Bjarne Stroustrup的命名约定,但原则上,我已经看到人们在这里和那里对其他语言使用一些相似的规则。

因此,基本思想是在阅读代码时应该能够将标准类型与用户定义的类型区分开。例如,Bjarne Stroustrup建议使用

类型(例如Square和Graph)的首字母大写

考虑到

C ++语言和标准库不使用大写字母

可以实现上述目标。

但是,为什么我们需要这样做呢?区分标准类型和用户定义类型的目的是什么?

在这件事上,我找不到Bjarne Stroustrup的任何推理,而且,我自己以截然相反的方式思考。:DI知道,我知道,“我要和谁争论Stroustrup?” 但是,听着,许多C ++语言功能(例如,运算符重载)用于允许用户定义类型的语法支持水平与标准类型相似。然后所有这一切都被另一个命名规则所困扰...

PS更不用说一个单词常常不足以命名一个班级,而以大写字母开头的下划线分隔的单词看起来太陌生了。


6
最后,您也可以称其为匈牙利表示法的一种形式(即,在名称中嵌入有关类型/用法的信息),通常对此不予理会。因此:好问题。
stijn 2014年

2
@stijn:是的,但是你知道为什么会皱眉吗?过去,当每个人都使用文本编辑器编写程序时,通过查看标识符来了解类型非常有用。但是今天,您只需将鼠标悬停在任何现代IDE上的标识符上,它将告诉您类型。
罗伯特·哈维

4
@RobertHarvey除了在功能强大的IDE或主要使用纯文本编辑器的社区中也避免使用匈牙利表示法之外。

1
@RobertHarvey不,我同时意识到(“ apps Hungarian”和“ systems Hungarian”),根据我的经验,在Python和Rust中都不常见。

3
@RobertHarvey您是说匈牙利符号仅在C,C ++和VB中存在吗?无论如何,我要问的是您对它被皱眉的原因提出质疑(这是多余的,仅因为我们有告诉您类型的IDE),因为该原因不适用于没有此类ID的语言,并且,通过您的推理,应该从匈牙利受益。动态类型化Python没什么区别,实际上它应该增强推理能力,因为通常程序员在编写代码时会知道类型,但是不能自动推断出它们。

Answers:


5

这样绝对没有目的或利益。C ++的目标之一是可互换地对待UDT和原语,尽管它们还没有完全成功,但这是您无需区分的领域。

说到命名,Stroustrup是疯子,这是一个科学证明的事实。


2
我将看到您的RAII,并为您提高SFINAE。
罗伯特·哈维

5
我可以看到将标准类型与UDT区别开来可能有用。除非你有一个你不应该改变一个标准库中的代码真的很好的理由,所以看到小写表明您不必在代码中去看看,因为,它的标准库。
罗伯特·哈维

4
@delnan:是的。这无非是“许多人”对权威的呼吁。如果“许多人”想在这里讨论他们的推理,他们可以自由地这样做,在那之前,他们没有任何补充。FTR,我也对UDT使用大写...也用于我需要别名的基元。
DeadMG

2
@RobertHarvey:假设您看不到标准类型。或者通过将鼠标悬停在您的环境中并查看“ std ::”。或使用“转到定义”或其他方式。所以基本上,它不适用。
DeadMG

1
我一直认为,目的是在命名空间出现之前将其与标准类型区分开。如今,这只是旧思想的遗迹(“最佳实践”在不久前就不再是最好的)。FWIW,在我的个人项目中,我snake_case在类和名称空间中使用小写字母,并且还没有由此引起的问题或混乱。
utnapistim 2014年

3

命名约定是关于支持人类(即程序员和维护者)对代码的理解。

可以指定UDT,以便变量的声明,初始化,表达式和语句在它们上的作用与标准类型不同。为了发现问题,对于维护人员来说,暗示某些代码段可能会做一些时髦的事情很有用(例如,某个函数中使用的用户定义的整数类型的实现可能在加法方式上存在缺陷)。

提供这种提示的方法有很多(注释,设计规范等)。命名约定的优点是它们存在于代码中,而注释可以忽略,过时等。


2

我对类型使用大写单词的原因之一是将变量与类型区分开。这样可以声明一个变量,除了大写字母外,还应使用相同的名称:

Foo foo;
Graph graph;

这对于在每个上下文中仅使用一个实例的类(例如配置设置)很有用。


恕我直言,这不能回答标题中的问题。也许添加“在这方面,用小写字母命名标准类型仅是为了与cstdlib向后兼容”。
Vorac
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.