当您的命名约定与您的语言冲突时,您会怎么做?


14

好的,这是总是困扰我的那些小事情之一。我通常不缩写标识符,并且我唯一使用短标识符(例如i)的时候就是紧循环。因此,当我使用C ++进行工作时,这很烦我,我有一个需要命名的变量,operator或者class我必须解决它或使用缩写,因为它最终会突出。警告:这可能经常在我身上成比例出现,因为我在编程语言设计中投入了大量精力,其中领域对象可能会在宿主语言中反映概念,而无意间导致冲突。

您将如何处理?缩写?(op)拼写错误?(klass)还有吗?(operator_


7
除了命名空间,也许我们应该考虑更改命名约定?很抱歉,很明显。
克里斯,

1
@Chris:您永远无法相信程序员能够实现显而易见的目标!(尽管在这种情况下我有。)
乔恩·普迪

7
如果有任何理由喜欢PHP的$var语法,就是这样。
乔伊·亚当斯

3
@Joey Adams:当我看到这个问题时,我简短地笑了一下,并想起了所有围绕SE的PHP打击问题。
克里斯,

3
显然,更改语言源代码以允许使用我的命名约定。这也具有“保护”我的代码的好处,因为它只会在我的解释器/编译器上运行/编译。
Dietbuddha 2011年

Answers:


21
  1. 接受您可能必须对命名约定进行小的更改,例如增加大写字母。最好尽快接受,以便所有后续代码保持一致。

  2. 考虑更具体。关键词往往是相当广泛的,所以缩小class下来demonstrationClass,不仅对周围的工作问题,但同时也增加了可读性。


10

这不是我遇到的问题,但是如果遇到这种情况,我将尝试使用以下选项按顺序解决它。

  1. 尝试找到一个同义词。
  2. (尤其是变量)尝试查找前缀或后缀
  3. (尤其是对于类而言)将第一个字母更改为大写,并忘记了编码规则,即名称仅在大小写上不应有所不同。这个选项,我大概只会在与关键字冲突的情况下使用。
  4. 使用缩写。

1
我看不到仅在大小写不同的情况下出现了什么问题,尤其是在参数列表中,其中类型的参数const Foo&除之外没有任何合理的全名foo。当然,给它Foo一个更具描述性的名称可能比foo它存在于功能主体中且服务于较少的目的更好。
乔恩·普迪

@Jon-我同意,尽管我个人倾向于“ p _”,“ l_”和“ m_”前缀,而不是随情况而变化。我之所以采用该惯例,是因为所有名称都相同。当然,只要在任何特定上下文中一致地使用它,就可以使用哪种约定来处理它,这当然是无关紧要的-随情况变化的方法的使用范围肯定足够广泛,大多数开发人员都应该认识到它。
Steve314,2011年

@Jon-该注释看起来就像我仅在遇到同名问题时才有选择地应用约定,这不是我的意思。上下文问题与语言,项目等有关。约定的设计目的是使该问题在发生(或不发生)时不成问题,而不是根据需要有选择地应用。
Steve314,2011年

@ Steve314:我从第一条评论中得到了你的意思。我不知道,像这样的词缀总是让我感觉与Systems Hungarian有点太近了。
乔恩·普迪

@乔恩:这不是我虔诚地适用的规则,但是我发现,如果两个标识符仅大小写不同,则更容易犯错误。这些错误中的一些会被编译器发现,有些则很难发现(特别是如果两个标识符命名相同的事物时)。我宁愿有一个一般规则,有逐案例外情况,而不是一本涵盖所有可能案例的整本规则。
Bart van Ingen Schenau 2011年

6

语言胜出;您不能超过编译器(忽略PL / 1之类的可恶之处IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF END,但PL / 1不会首先引起您提出问题)。基本上,您必须遵循语言的规则,并且必须找到供自己使用的语言关键字的替代方法-或找到替代语言。

因此,除非在非常特殊的情况下,否则您会适应语言,反之亦然。


5

而不是缩写如何延长?如果要用Foo语言实现类构造,那么如何使用FooClass和foo_class?(无论您选择哪种套管,均取模)。


您会在Java代码中使用的每个标识符上加上“ java”前缀吗?而且甚至不用说在每个标识符上都加上前缀“ C ++”的问题了……
Steve314 2011年

@ Steve314,您不会在Java代码中使用前缀java,而会在实现Java编译器的c ++代码中使用前缀java。另外,仅当标识符的其余部分是关键字时才使用它。
温斯顿·埃韦特

好的-您的意思是广义上的加长,因为更具体地讲标识符也指的是。对于不同的应用程序,“类”可能会重命名为“ class_taught”或“ class_of_animal”或“ classiness_value”或其他名称。我同意-我只是发现面向编译器的示例令人困惑。
Steve314 2011年

5

我使用的一些缩写class,按频率排列:

  • cls
  • clss
  • clazz
  • theClass
  • aClass

如果我知道Class实例代表什么类,则可以将其包含在变量名称中:

  • stringClass = Class.forName("java.lang.String");

之前从未见过“ CLS”。我主要使用aClass。
Konstantin Petrukhnov 2011年

4

在C和C ++中,关键字都是小写字母,并且语言区分大小写,因此不时按下Shift键,很多问题就会消失。

在Modula 2中,关键字都是大写字母-但是,只要您的标识符包含一些小写字母,区别就很明显并且不可能发生冲突。

另外,绝对命名约定在某种程度上需要反映您所使用语言的常规约定,因此我当然会在Java中编写“ myClass”,而在C ++中更可能会编写“ My_Class”。

基本上,您不只是为编译器而写,而且人们发现可读性在某种程度上取决于上下文和相关期望。


3
即使是大小写敏感的语言,我觉得已经混合classClass将损害代码的可读性。
arma斯坦2011年

@Karmastan-也许这取决于您花了多少时间使用区分大小写的语言和约定。就个人而言,大写字母“ C”和小写字母“ C”在视觉上非常明显-我看到长标识符的大小写使用模式比我读它们更快。
Steve314,2011年

3

我通常不会遇到这个问题,但是当我这样做时,由于我使用的是Delphi,所以它通常不是问题,它允许您通过在标识符前加上&来解决此问题。因此,“类”不是有效的标识符,而“&class”是有效的标识符。


有趣。我有一个代码生成实用程序,该实用程序允许在可以使用标识符的任何地方使用字符串文字。最初,大多数用于生成代码的标识符都写为字符串文字,以避免与不断增长的(且关键字丰富)的DSL发生关键字冲突的风险。现在,大多数名称都使用了标识符(令人惊讶的是,这种方式使源更具可读性),但是字符串文字始终可以作为备用。我认为这对代码生成很有用,但是关键字冲突的解决方法在通用语言中不是一个好主意-但也许我错了。
Steve314 2011年

2

我会在变量名称中添加某种命名空间。例如,假设您有一个名为user的模块,那么我将变量名operator修改为user_operator或userOperator之类的东西。


2
只是不要使用“ smooth”,“ no”或“ my”作为前缀
Steven A. Lowe

2
绝对。我投票“ Jon_Purdys_Carefully_Chosen_Identifier_Prefix_”。
Steve314,2011年

1
@Steven:更糟糕的是,我看到了aan并且the被初学者CS学生频繁使用。
乔恩·普迪

1
@乔恩·珀迪,这不是我们的错!怪罪教授,决定将其实例命名为People()aPerson
本L

@Jon:我工作的命名约定规定了局部变量应以a紧循环变量开头:/
Matthieu M.11年

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.