Language agnostic 避免语言关键字冲突

Language agnostic 避免语言关键字冲突,language-agnostic,conflict,keyword,Language Agnostic,Conflict,Keyword,你们如何避免语言中的关键词冲突 例如,我正在创建一个类(VB2008)来保存我们生成的一些报告的所有配置变量。当然,其中一个变量是“日期”。当然,你不能把任何东西命名为关键字。在VB 2008中,你可以选择用[]来包围一个冲突的单词并修复它,但我一直认为这是一种攻击。有什么建议吗?在常见的关键词中,你的名字是什么 帮助可视化的代码 Dim m_Title As String Dim m_Date As String Public Property Title() As String

你们如何避免语言中的关键词冲突

例如,我正在创建一个类(VB2008)来保存我们生成的一些报告的所有配置变量。当然,其中一个变量是“日期”。当然,你不能把任何东西命名为关键字。在VB 2008中,你可以选择用[]来包围一个冲突的单词并修复它,但我一直认为这是一种攻击。有什么建议吗?在常见的关键词中,你的名字是什么

帮助可视化的代码

Dim m_Title As String

Dim m_Date As String

Public Property Title() As String
    Get
        Return m_Title
    End Get
    Set(ByVal value As String)
        m_Title = value
    End Set
End Property


Public Property [Date]() As String
    Get

    End Get
    Set(ByVal value As String)

    End Set
End Property 

大多数语言都有逃避任何保留词的功能。C#有@,所以可以使用@class作为参数名(MVC采用者正在学习的东西)


如果域声明使用某个单词来描述它,那么这就是保留字转义的目的。即使这意味着需要更多的输入,我也不会害怕逃避保留字,以使我的模型更接近域-清晰是值得的

可能考虑变量更具体的性质


根据您的示例,“日期”可以是“创建日期”或“发布日期”或其他任何内容。如果发现变量名过于琐碎,可能会使代码过于简单(甚至混淆)。通过创建清晰而简洁的变量名来帮助您的同事。

为了避免命名与关键字冲突,我不使用关键字


在你的情况下,日期。什么日期?如果我必须维护你的应用程序,那可能是我首先要问的。关键字的好处在于它们是完全通用的,变量名永远不应该是这样。

不要把
[Date]
看作是一种攻击;如果属性表示日期,则应将其称为
date
。使用您现有的工具完成工作。就个人而言,我觉得属性的名称只是为了避免此类冲突,这更像是一种黑客行为,因为每次使用该属性时,您都要处理它。

拼写错误的变量名称

没有灵丹妙药,但现代语言在管理名称空间方面有很大帮助


在我的例子中,我诅咒C有一个“<代码>索引>代码>”命令。

on .NET,合理地考虑公共语言规范(CLS)是您应该迎合的最低公分母。这在ECMA-335“通用语言”中有记录 基础架构(CLI)分区I到VI”。这里是它特别提到的名字;CLS规则4(8.5.1“有效名称”)中的注释:

CLS(消费者):不需要使用违反CLS规则4的类型,但应具有允许访问使用其自身关键字之一作为名称的命名项的机制

所以不,这不是真正的黑客行为,而是一条明确的规则。它之所以存在,是因为.NET对于目标语言来说是可扩展的,所以您永远无法避免名称冲突。如果你讲C#,就有VB。如果你涉及到C#和VB,就有C++/CLI。如果你涵盖所有这些,就有F#和Delphi Prism。等等因此,CLS要求语言提供一种方法,将关键字作为标识符转义;我列出的所有语言都提供了这样做的方法(因此是符合CLS的消费者)

一般来说,避免与C#或VB非上下文关键字冲突仍然被认为是一种良好的方式,主要是因为这两种语言在很大程度上是最流行的。例如,这就是为什么它是
HashSet
,而不仅仅是
Set
——后者是一个VB关键字的原因。完整列表包括:

“日期”或“日期”。

这是一个Perl完全回避的问题。 变量总是有一个
$%@*&
,唯一可能发生冲突的是全局/句柄和子例程

甚至这也不是什么大问题,因为Globs/Handles不再经常使用了

在Perl中,子例程和关键字非常相似。如果需要获取内置子例程/关键字,可以通过附加
CORE::
,例如
CORE::dump
,来获取它

实际上,我认为您唯一会遇到问题的关键字是
sub
my
local
和“our”,因为这些关键字在解析器中很早就被解析了。请注意,您仍然可以使用这些名称创建sub,如果不指定全名,或者从一个受祝福的引用,或者使用一个符号引用,它将无法工作

{
  package test;
  sub my{  print "'my'  called using $_[-1]\n" };
  sub new{ bless {}, $_[0] };
  sub sub{ print "'sub' called using $_[-1]\n" };

  sub symbolic{
    *{__PACKAGE__.'::'.$_[1]}{CODE}->('symbolic reference');
  }

  my $var; # notice this doesn't call test::my()
}

package main;
my $test = test->new;

# Called from a blessed reference
$test->my('blessed reference');
$test->sub('blessed reference');

print "\n";

# Called using the full name
test::my('full name');
test::sub('full name');

print "\n";

# Called using a symbolic reference
$test->symbolic('my');
$test->symbolic('sub');
输出:

'my' called using blessed reference 'sub' called using blessed reference 'my' called using full name 'sub' called using full name 'my' called using symbolic reference 'sub' called using symbolic reference “我的”使用祝福的引用调用 使用受祝福的引用调用“sub” “我的”使用全名呼叫 使用全名调用“sub” 使用符号引用调用“my” 使用符号引用调用“sub”
当你的代表为1时,你只能发布这样的建议,而否决投票不会让你付出任何代价;o) 这是一个非常好的建议,在Python中被广泛使用(使用“klass”,因为“class”是一个关键字)。不仅变量有名称,类也有名称。名为
Date
的类是完全合适的。