避免语言关键字冲突

时间:2009-07-17 19:55:26

标签: language-agnostic conflict keyword

你们如何避免用你的语言冲突?

例如,我正在创建一个类(VB 2008)来保存我们生成的某些报告的所有配置变量。当然,其中一个变量是“日期”。当然,您不能拥有与关键字相同的任何名称。在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 

9 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

不要将[Date]视为黑客;如果您的属性代表日期,则应将其称为Date。使用您可用的工具完成工作。就个人而言,我觉得那些拥有他们所做的名字只是为了解决这些冲突的属性更像是一种黑客攻击,因为每次使用该属性时你都会处理它。

答案 2 :(得分:1)

拼写你的变量名!

答案 3 :(得分:1)

在.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关键字。完整列表是:

答案 4 :(得分:0)

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

如果域声明某个词用于描述它,那么就是保留字的转义。我不会害怕逃避保留的话来让我的模型接近域名,即使它意味着更多的打字 - 清晰度是值得的!

答案 5 :(得分:0)

为避免与关键字发生命名冲突,我只是不使用关键字。

在您的情况下,日期。什么日期?如果我不得不维护你的申请,这可能是我要问的第一件事。关键字的优点在于它们完全是通用的,变量名称永远不应该是。

答案 6 :(得分:0)

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

就我而言,我诅咒C有'index'命令的事实。

答案 7 :(得分:0)

“Date_”或“_Date”。

答案 8 :(得分:0)

这是Perl完全回答这个问题的一个问题。

变量总是有一个$%@*&,唯一可以冲突的东西是Globs / Handles和子程序。

即便这样也不是问题因为Globs / Handles不再使用了。

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

我认为您遇到问题的唯一关键字是submylocal和“我们的”,因为这些关键字在解析器中很早就被解析了。请注意,您仍然可以使用这些名称创建一个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