如何为“电话号码”,“摩托车”,“波长”等单词写驼峰式大写字母


75

我在理解如何将camelCase语法应用于某些变量名时遇到问题。

例如,在驼峰式的情况下,我应该如何正确写出“ phonenumber”之类的词?是phoneNumber还是phonenumber?与“用户名”类似,是username还是userName

我认为它看起来不正确的骆驼一样的情况下motorCyclepassWordsunDaysetUpwaveLength因为这些都是每个只有一个字。我认为这可能是为什么它被调用的原因,hashMap但是hashtable在驼峰的情况下也没有大写的原因,因为哈希表是一个单词,而哈希映射是两个单词。

但是,如果摩托车有颜色,那是motorcycleColor因为单词被串联了吗?那是正确的还是应phoneNUmberwaveLengthsunBlock甚至sunDay一周的星期天?

例如为什么为什么getISOCountries在说“ HttpHeaders例如”的情况下调用该方法,例如,如果我们有类似String camelCaseString = dog.toCamelCase()或的方法,则不清楚什么会变成小写interface CamelCase

相关:https//english.stackexchange.com/questions/889/when-should-compound-words-be-write-as-one-word-with-hyphens-or-with-spaces


7
对于很难确定两个单词的短语是否为复合单词的情况,请选择大写并坚持使用。与大多数编码约定一样,在单个项目中保持一致是最重要的。
凯文

2
很好的问题,我总是问自己如何写“ fileName”(和错误的“ filename”)。我认为这个词的写法因程序员而异……
Ray

3
@PacMani您可能会喜欢这里的讨论!
杰森C

4
@ 909Niklas我会尽可能地完全放弃“名称”。只需使用“街道”即可。如果它是字符串,那么它就是名称,除非这是有害的或令人困惑的。 username就是这样,它是一个呼号,而不是“用户名”,因此它更像是摩托车,而不是firstName或lastName(应使用驼峰式包装)
Peter Turner

2
@PeterTurner一些程序员会说这street应该是一个类name及其属性/数据成员之一。
JAB

Answers:


173

您应该在“通常”有空格的地方大写字母(当您写字母而不是源代码时)。您的第一个假设是正确的:

  • 这是“摩托车”,而不是“摩托车”,因此您的变量应命名为motorcycle,而不是motorCycle
  • 这是一个“哈希图”,因此您可以选择hashMap,而不是hashmap
  • “星期日”是一个词-> sunday,不是sunDay
  • 而“星期几”则dayOfWeek不是dayofweek

4
就其价值而言,我和我的团队通常只用hashmap一个词,尽管具有讽刺意味的是我们不这样做tree map耸耸肩
corsiKa 2014年

1
好吧,摩托车是一个边缘情况(实际上,它原本是摩托车,尽管现在有所不同了);honeyBee(而不是honeybee,实际上不是“ honeybee”,而是“ honey bee”),和butterfly
orome 2014年

3
非地址的setUp情况虽然是一个边缘情况,它是一个单词,但是从JUnit历史上看,它的夹具初始化名为setUp
TC1 2014年

23
@ TC1实际上,“设置”是一个名词,而不是动词。“设置”正确的操作形式。JUnit没错,我们其余的人都是边缘案例。:)
Jason C

3
@JasonC谢谢,终于明白了,为什么对口是tearDown:D
TC1

44

第1部分
我认为令您感到困扰的是,您的一些示例是复合词,而其他一些则不是。

  • 电话号码//不是复合词
  • 摩托车//复合词
  • 波长//复合词
  • 防晒霜//复合词
  • 星期日//复合词*
  • 摩托车颜色//与非复合词一起使用的复合词。

复合词中的第二个词不遵循驼峰式表示法。

所以motorcycle不是motorCycle

但是“电话号码”不是一个复合词,它遵循驼峰式的表示法。即phoneNumber

这导致:motorcycleColor

如果我不记得某个单词是否真的是复合单词,那么可以在字典中查找它以确保确定性。

第2
部分您的两个示例有些棘手。

  • 哈希图
  • 哈希表

它们很棘手,因为有些人会将它们拼写为“ hashmap”和“ hashtable”。根据我刚刚检查的字典,它们是单独的单词,而不是复合单词。因此正确的骆驼案将是hashMaphashTable。并非每个团队都遵循该约定,因此您需要询问队友他们更喜欢什么,然后坚持下去。在这种情况下,一致性比字典所讲的正确更重要。

*有些人会争辩说星期日是一个复合词,因为一周的其他日子并非如此,但出于这个问题的目的,我将回避该问题。最容易将其视为复合词,因此没有驼峰案例。


6
一周的其他日子也都是这样:“ Monday” <-月亮日,星期二<-Tiw那天,星期三<-Woden那天,星期四<-Thor那天,星期五<-Frigg's那天,星期六<
-Saturn

6
@kevincline:现在,这些日期名称的形式现在可能被认为是过时的,因此,实际上并没有真正考虑在内。...除非您实际上编写的代码看起来像是if (currentDay == thorsDay) {...Hmm ,否则,当您想获取星期几的全名时,太糟糕的日期库没有这种格式设置选项。
FrustratedWithFormsDesigner 2014年

15
@FrustratedWithFormsDesigner:关键是在现代用法中,星期日与星期一相同,是一个复合词:完全没有。“星期日”中的“太阳”可以单独站立,而“月亮日”缩短为“星期一”,这只是一个偶然事件
kevin cline 2014年

6
更好的是,为变量使用比hashMap或hashTable更好的名称。这条路很滑,导致出现以下美妙的代码行:HashMap hashMap = new HashMap();
Eric Andres

8

正如其他人指出的那样,在连接单词时会使用驼峰式大小写。请勿在单个英文单词中使用驼峰式大小写。问题在于确定哪些化合物是单个单词。留给他们自己,程序员将根据他们的英语知识做出不同的决定。这导致大写不一致,几乎和拼写错误一样令人讨厌。

为避免这种情况,程序员在不确定拼写或大写字母时应使用标准参考(例如dictionary.com)。 即使这样,如果命名的一致性对您的项目很重要,也没有替代代码检查的方法。

为您的项目选择一个参考将解决大多数有关大写和拼写的争论。有一些像Hashtable这样的化合物不在字典中,但是在Java和C#API中被大写为单个单词。您将需要在项目范围内做出决定。在Java中,它是“ HashMap”,但是“ Hashtable”。IMO“哈希表”显然是不正确的;除了在API中作为名称外,它永远不会显示为一个单词。


4

最简单的骆驼保护方法是在单词轮廓上。

您的问题中的示例:

  • 电话号码:phoneNumber
  • 摩托车:摩托车
  • 星期日:星期日
  • 波长:波长

如果您不希望将其拆分为两个单词,则也不要在其上使用驼峰式大小写。否则,您会在音节上使用它,这看起来有多愚蠢

  • 辅助(这是一个5个音节的单词;更不用说我看起来像是在非等宽/无衬线字体上的胡扯)。

5
电话号码不是它自己的单词,将它作为一个单词输入到Google中,它会很高兴地查找所有具有“电话号码”而不是电话号码的内容。设置不是两个字,也不是密码。
Jeff Langemeier 2014年

6
@JeffLangemeier一个非常小的问题:“ setup”是一个名词,而“ setup”是一个动词。因此,如果您有一个表示如何设置某些对象的对象,则将调用它setup,而如果您有一个设置某些对象的函数,则将调用它setUp
bdesham 2014年

2
@bdesham我意识到这一点,但是我会远离setUp,因为将初始化一个更好的,不太模糊的动词,所以我实际上完全忘记了setup的动词版本。
Jeff Langemeier 2014年

1
我认为以“ wa”开头的那个可能是wavelengthwaveLength取决于所讨论的值是否与传播速度除以频率有关,还是与某种波的“长度”(不一定是距离)有关。例如,与波关联的样本数量的音频合成库的变量不是wavelength而是waveLength
supercat 2014年

2
@kevincline:在音频合成引擎中,通常有包含一个或多个整个波形样本的波形表。当播放到达表格的末尾时,它会循环回到开头(对于简单引擎)或到wave中的其他某个位置。可以肯定的是,WaveLength除了最简单的情况之外,它本身在任何情况下都会有点含糊[它是指缓冲区的大小还是循环部分的长度],但是这些单词可以很完美地出现在更长的名称中。
supercat 2014年

4

这就是使用简单英语的麻烦所在,它妨碍了后来的人们如何在编程上下文中滥用英语以使其符合标记的空白规则。

在您给出的示例词中,几乎所有词都是复合词。星期日不是,因为它起源于一个复合体,但它早已如此久远,以至于现在几乎不再被认为是星期日,尤其是因为献给太阳更是一种历史的好奇心,而不是宗教和文化的重要部分讲英语的人的外表。

用英语,写复合词的三种主要方式是打开(两个单词之间有一个空格),连字符和关闭(两个之间没有空格或连字符)。尽管在某些情况下有一些用于联结开放化合物的规则,但是除了了解其他人所做的事情外,没有什么确切的规则可以知道给定化合物使用哪种形式的固定规则,而且有时候会找到两种甚至三种形式(例如,打蛋器打蛋器打蛋器)。

在这里,电话号码几乎总是开着写的,因此应将其视为两个字。

并且当相互封顶以形成标记时,空格或连字符将被删除,第二个及后续单词以标题形式书写,因此phoneNumberPhoneNumber符合您的约定。

使事情phoneNumber看起来很奇怪很可能是它更普遍只给出phone在大多数情况下,或number当上下文是关于一个电话连接。


2

确保代码文件中的一致性。

促进代码项目内的一致性。

在代码库中更喜欢一致性。

随着我们对给定的凝集越来越熟悉,表示概念的单词的复合也发生了变化。

例如...

  • “电话机”缩短为仅“电话”
  • “电话”缩短为“电话”
  • “电话号码”有时被压缩为“电话号码”
  • “电话号码”很快成为“电话号码”
  • “电话号码”通常进一步缩短为“电话”
  • 如今,通常使用“手机”或“手机”
  • “家庭电话”和“工作电话”可能很快也会变得很普遍

请注意,StackExchange拼写检查器无法下定决心。上面句子结尾处的“电话号码”很好,但它在句子开头标记了一个(是否大写)。

大多数人都希望有一种“正确的方法”来做事,而就语言而言,那是永远不可能的。到您完成项目时,用法可能已经改变。当然,您的理解将发生变化,并且方法/et.al的功能也会改变。可能也会改变。(在这种情况下,您可能应该适当地更改名称。)


-1

从严格的技术(美国)角度来看,xxx-yyy-zzzz是您通常认为的“电话号码”,xxx部分正确地称为区号,而yyy部分正确地称为区号。交换,zzzz被正确地称为数字。

由于“ phonenumber”不仅不是一个复合词(尚未),而且如果变成一个复合词,它会错误地引用其创建者意图之外的内容,因此我会说camelCase语法将需要phoneNumber来引用它的任何变量,但是如果您将要使用实际的电话系统执行任何操作,我将使用phoneExchangeNumber代表七位数,并使用phoneACExchangeNumber代表十位数版本。


1
这似乎并没有提供任何实质性的超分制成,在解释这个答案之前,这是张贴在3年前
蚊蚋
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.