当逻辑选项是保留关键字时如何命名?[关闭]


64

有时候,某些事物(例如变量)的最合逻辑的名称是所选语言或环境中的保留关键字。当没有同等合适的同义词时,该如何命名?

我想象有针对此问题的最佳实践启发式方法。这些可以由编程语言和环境的创建者或管理者提供。例如,如果python.org(或Guido van Rossum)说了如何用Python处理它,那将是我书中的一个很好的指导原则。有关如何使用C#处理它的MSDN链接也将很好。
另外,软件工程中主要影响者提供的指南也应该是有价值的。也许Google / Alphabet有一个不错的风格指南,可以教我们如何处理它?

这只是一个示例:在C#语言中,“默认”是保留关键字。当我使用枚举时,我可能希望将默认值命名为“ default”(类似于“ switch”语句),但不能这样。
(C#区分大小写,枚举常量应大写,因此“ Default”是显而易见的选择,但让我们假设当前的样式指南规定所有枚举常量都应为小写。)
我们可以考虑使用“ defaultus”一词。 ”,但这不符合“最小惊讶原则”。我们还应该考虑“标准”和“初始”,但是不幸的是,“默认”是在这种情况下准确传达其目的的词。


15
我会使用类似“ default_value”的名称。含义保持不变,但是您必须再输入几个字符。
Mael

26
@Darkhogg如果我在我的代码中找到了任何一个,我会立即更改它们。不接受拼写错误或违反命名约定的行为。
MetaFight

26
@MetaFight-除了在Java中之外,调用保存类的变量clazz实际上是事实上的标准。它实质上平台命名约定的一部分。做其他任何事情都会违反别人可能已经阅读过您的代码的期望,因此仅在绝对必要时才应这样做。
Periata Breatta

6
默认值, 因为枚举值似乎适得其反。它应该是描述默认值的特定于域的名称。不过,应该有一种方法可以返回默认值。
qwerty_so

18
@AndresF。我不同意。我经常发现很容易与Java的设计师抗衡。不过,我不反对他们。他们在荒野的西部工作。
MetaFight

Answers:


63

对于枚举选项,应使用标题大小写Default。由于C#区分大小写,因此不会与保留关键字冲突。请参阅.net命名准则

由于.net中的所有公共成员均应为标题大写,而所有保留名称均为小写,因此,除非使用局部变量(包括参数),否则您实际上不会遇到这种情况。而且当地人通常会使用名词或短语作为名称,因此,最自然的名称会与关键字发生冲突非常罕见。例如。defaultValue通常会比使用更自然的名字default。因此,实际上这不是一个大问题。

在C#中,您可以使用“ @”前缀转义保留的关键字,以便将它们用作标识符(如@default)。但这仅在您确实没有其他选择的情况下才应使用,即,如果您与使用保留关键字作为标识符的第三方库进行接口。


当然,其他语言具有不同的语法和关键字,因此该问题的解决方案也不同。

SQL有很多关键字,但是简单地转义标识符(如)是非常普遍的[Table]。有些甚至对所有标识符都这样做,无论它们是否与关键字冲突。(毕竟,将来可能会引入冲突的关键字!)

Powershell(以及其他一系列脚本语言)在所有变量之前都带有$之类的符号,这意味着它们永远不会与关键字发生冲突。

Lisp根本没有关键字,至少没有传统意义上的关键字。

PythonPEP-8中有一个官方认可的约定:

始终对类方法的第一个参数使用cls。

如果函数参数的名称与保留关键字发生冲突,通常最好在其后附加一个下划线,而不要使用缩写或拼写错误。因此,class_优于clss。(也许最好通过使用同义词来避免此类冲突。)

诸如BrainfuckWhitespace之类的某些语言完全避免定义单词,从而巧妙地避开了问题。

简而言之,您的问题没有与语言无关的答案,因为它很大程度上取决于特定语言的语法和约定。


2
但是,您不应该仅依靠区分大小写。尽管实际上这不是问题,但并非所有.NET语言都区分大小写,因此您有时可能会遇到意想不到的问题。
Vivelin

6
@Vivelin:您不应具有仅在大小写不同的公共成员或类型名称,因为这可能导致其他语言的问题。但这与我的建议无关,因为关键字不是标识符(其他语言将具有其他关键字)。
JacquesB

即使@语法可用,它还是IMHO的最佳保留,适用于需要与使用不同关键字编写语言的库进行交互的情况。即使在那儿,我认为拥有某种语言功能也可能会更好#define,但是右手操作数将始终被解释为区分大小写的标识符。这将允许解决多种命名冲突(对于不区分大小写的语言,包括除大小写外均相同的符号的导入)。
超级猫

@Vivelin 并非所有.NET语言都区分大小写 -我知道VB.NET和Powershell。还有其他吗?
Zev Spitz

@ZevSpitz OP特别调用了C#,这就是为什么我认为Vivelin使用它作为示例,但是正如您所说的,VB.NET不区分大小写,因此,像往常一样,我认为它将归结为每种语言的基础。 。并非所有语言都有相同的保留词
Shaggy13spe'1

22

我会附加一个下划线(default_)

优点:

  • 简单
  • 很明显(为什么还要加上下划线?)
  • 一致的
  • 易于使用
  • 我知道的所有现代语言都可以使用
  • 最接近逻辑选项

为什么我不喜欢其他解决方案:

代名词:

  • 很难找到
  • 通常含义不完全相同(细微差别)

追加/追加单词:

  • 不一致(defaultValue,defaultItem)
  • 冗长而又不增加可读性

更改字母(用clazz代替class):

  • 不一致(clazz,klass,klazz)

附加数字(默认值1):

  • 提出了default2的问题

追加/追加字母:

  • 不明显(程序员必须猜测它是用于名称冲突的,而不是其他名称的快捷方式)

转义关键字(@default(c#),`default`(scala))

  • 仅在某些语言中可能
  • 很少使用的功能,主要是为了与其他语言兼容
  • 使得您的api用户很难使用(他们必须知道该怎么做并记住该怎么做)

我什么时候不使用它:

  • 现有的,广泛使用的其他公约
  • 我已经知道合适的同义词
  • 在您的特定枚举情况下,我将遵循@JacquesB的答案

7
这是Python中经常使用的解决方案。我不主张它是最优雅的,但是它可以工作。
fralau

1
@fralau Python ist特别糟糕-我真的很讨厌像“输入”这样的标识符
Christian Sauer

在许多语言中,人们会看到klass一个变量,其中class保留字。我没看过,defawlt但是是同一主意。我希望default_class_这样做可能会践踏任何已建立的约定)。
nigel222 '17

您没有包含转义关键字的选项。
CodesInChaos

1
尽管我不确定这是“显而易见的为什么使用下划线”,但您提出了有效,明智的论据。我很少与知道他们正在使用的语言的所有关键字的朋友一起工作!
保护者

18

“默认”可能不是有用的枚举值。它表示一种行为,该行为可能会根据使用环境的不同而有所变化。

话虽这么说,如果您的语言区分大小写,请对该单词使用不同的大小写。(默认与默认)

或者更好的方法是,花更多的精力键入更多字母并将其命名为DefaultValue。


3
我同意。“默认”不指示该值是什么。考虑enum ErrorHandlingLevel { Default = 0, ... }enum ErrorHandlingLevel { None = 0, ... }。在第二个示例中,None可以通过使用xmldoc或在代码中显式将枚举值设置为0来了解默认情况。您会获得额外的好处,即知道将对象ErrorHandlingLevel设置为时的含义None。将其与检查ErrorHandlingLevel设置为默认值的对象进行比较。
哈里森·潘恩

9

我强烈建议不要为了消除歧义而在本地更改命名约定(或添加无意义的字符)(就像其他帖子中所建议的那样)。如果意图不明显,则会引起混乱,并且可能会引起疑问,为什么要这样命名。没有它就可以解决。

在每种情况下,都应该可以使用具有同义含义的单词,或者使名称更具体(甚至冗长)。即使可能引入上下文重复,它也可能是更好的解决方案。

例如,假设您有一个枚举Mode应公开默认值(如您的情况)。default_mode由于重复的原因,命名似乎不是最好的,但是在传达期望的含义时避免了歧义。


您提出了一个正确的观点,但是我仍然不确定是什么造成了更多的混乱:具有一致的附加片段或在每种情况下使用不同的词。当然,反对前一种选择的情况是,首先希望使用它的情况如此罕见(希望如此),以致无法从现有代码中推断出一致性。
保护者

3

您需要使用其他或修饰的单词,这很清楚。
所以这通常意味着

  • 一个完全不同的词
  • 前缀
  • 后缀

另一个要确定的因素是如何连接多个单词,并且选项通常是

我的建议是使用前缀或后缀以及下划线/破折号,例如

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

local_default这样做的好处是所有本地人都对齐,因此可以迅速脱颖而出,但缺点是您必须先阅读第二部分才能获得唯一名称。 default_local具有相反的优势,即可以快速看到唯一的变量名,但是本地对象并不总是那么容易在视觉上分组。

我所看到的domain_specific方法的两个示例是:保留字vehicle_model代替modelroom_table对于SQL表,table它是保留字。

我见过的语言或脚本使用的其他两个选项是:

  • 用引号或反引号将变量名引起来,从而允许使用保留字。与此类似,我可以想象某些语言可能允许特殊字符(例如退格键)转义名称。
  • 变量名称中的空格。

也许有一点有趣的旁注:我已经看到words_with_underscores-or-dashes有两个名称被提及- snake_case使用下划线和kebab-case使用破折号。我发现后者很有趣。
VLAZ

2

显然,请尽您所能避免这种情况。自1970年代末以来,我一直在编写软件,而我真的非常不得不捏造保留字的时间在10岁以下,可能接近5岁。

您可以执行许多操作,例如将第一个或最后一个字母(reservedd)加倍或添加前导或尾随下划线(reserved_)。适当的选择将在很大程度上取决于您所使用的约定,尤其是关于下划线或下划线。另外,请不要对可能被人误读的情况做一些事情(例如,使用Reserved不同于的情况reserved)。

选择了某些内容后,将其放入您的编码指南中,请确保人们了解它并确保其被一致使用。我什至甚至添加了提醒评论,因此读者不认为这是一个错字,并且知道他们会再次看到它:

int ccase;  // Name dodges a reserved word

10
不是downvoter,但“翻番第一个或最后一个字母”建议发凉下来我的脊椎....
威廉·Rumpt

@WillemvanRumpt我也不喜欢这样做,但是在很长的一段时间里,它只能在做体操之间做出选择,以避免保留一个会引起很多头抓挠的保留字,或者一个看起来有点奇怪的标识符。
Blrfl

6
没有判断的意图,只是....发冷....冷的...;)
Willem van Rumpt

1
下划线后跟比最后一个字母加倍好。(是否投赞成票classs?)
nigel222 '17

1
编码准则!那就太好了!好点子。
保护者

2

在C#中,可以在标识符前面加上@。这告诉编译器将名称视为标识符的名称,而不是可能的关键字。

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 

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.