【问题标题】:Does my variable naming convention have a name?我的变量命名约定有名称吗?
【发布时间】:2009-07-16 21:55:53
【问题描述】:

所以我使用这个 Delphi 命名方案,参数以 A 开头,类变量以 F 开头,本地变量以 M 开头。该方案有名称吗?我在 Delphi 源代码中看到了很多我想阅读更多关于它的信息,但我不确定它叫什么。

【问题讨论】:

  • 用F 命名全局变量是为了混淆。 F 是字段名称的约定,而不是全局名称。
  • 对,我的意思是类变量,我几乎从不使用全局变量,所以我只是把它们称为错误的东西。

标签: delphi naming-conventions


【解决方案1】:

这种编码风格在Object Pascal Style Guide 中被明确指出,因为不是是匈牙利符号(有一个例外,enumerated types。)

您所谈论的特定编码约定没有这样的名称,据我所知,这只是您正在编写符合 CodeGear(旧 Borland)编码风格指南的代码。指南似乎没有给样式命名。

您在 Delphi 源代码中经常看到它的原因是因为本指南是基于 Delphi 团队开发的编码风格!

这份文档非常值得一读 - 不仅是为了代码指南,而且出于对它提到的其他内容的兴趣。

【讨论】:

  • WTF?为什么这被否决了?这个IMO是最好的答案,它肯定是最正确的。事实上,我删除了我的答案,因为这个更好。
  • 嘿嘿,他们真的需要从该文档中删除 Charlie Calvert 的旧 Borland 电子邮件地址。 Charlie 现在为 Microsoft 工作。
  • 虽然答案是一个很好的答案(我赞成),但为了提供样式来源的参考,我阅读的文档确实称它为匈牙利语当它说:“匈牙利符号规则的例外是枚举类型。”即常规的 F 约定是匈牙利符号。
  • 感谢一晒的评论。为了澄清我写的内容,我以不同的方式阅读它——它说“我们不鼓励使用符号,除非在标题翻译中需要”,并给出了一个“正确”的例子,如“FMyString: string;”。并且“不正确”为“lpstrMyString: string;”。我认为“lpstr”是匈牙利符号前缀,而“F”不是,根据他们的定义。枚举是例外,因为它们的前缀是表示枚举类型的字符,例如“按钮种类”的“bkOk”。真的这是一个语义问题,我想它是有争议的范围说明符是匈牙利语:)
  • 大卫是对的。 “匈牙利符号规则”是指不鼓励使用匈牙利符号的规则,因此例外是命名枚举值,它确实使用匈牙利符号。但值得指出的是,OP 风格指南 nothing 关于命名参数,它说本地人使用与字段名称相同的规则,没有前导 F — 所以没有 M 或 @ 987654325@。充其量,Peter 的风格是 OP 风格的派生,就像所有 Delphi 编码风格一样,但我真的认为更接近的是 Indy 风格,它使用了更多的前缀。
【解决方案2】:

您的架构可以被视为某种形式的Hungarian notations (HN)。通常 HN 用于表示变量的type,但正如维基百科所述,

符号有时会扩展为 C++ 包含 scope 的 变量,用下划线分隔。 这个扩展也经常被使用 没有匈牙利人 类型规范:[..]

【讨论】:

    【解决方案3】:

    我会说您的命名约定与匈牙利表示法并不完全匹配,但它往往更接近于查尔斯西蒙尼发明的原始匈牙利表示法,后来被称为Apps Hungarian。但不完全是。

    实际上有两种匈牙利符号:

    • Apps Hungarian - 这个想法是根据标识符存储的语义信息来装饰标识符名称,因此基本上是变量的用途:
    rwElement - 变量代表一行(“rw”) colElement - 变量代表一列(“col”)
    • Systems Hungarian - 前缀编码变量的实际数据类型。
    szName - 变量是以零结尾的字符串(“sz”) lAccount - 变量是一个长整数(“l”)

    因此,尽管您的命名约定在某种程度上代表了某种目的,但这并不是 Apps Hungarian 所指的真正目的。

    【讨论】:

    • 他使用了一种表示范围的匈牙利语形式。我不会说这比数据类型更接近目的。
    • 我的理由是它远非数据类型,但设计应用程序时的范围是有目的的。这当然不是同一个目的,但在两者中,它更接近于一个目的。
    【解决方案4】:

    一般来说,这听起来像匈牙利符号 - 但它没有指定 A、F 或 M 约定,具体来说,只是在名称中添加类型信息。

    【讨论】:

    • 我认为匈牙利人将类型和内容信息放在那里——就像 piVar 如果 var 是一个指向 int 的指针并且还指定了一组要使用的值。我的意思是我认为它比“前缀”更具体,但我可能错了。
    • 匈牙利符号可以用不同的方式完成,但作为一般规则,将语言特定信息放在变量名中称为匈牙利符号。乔尔著名地辩称,它应该完全不同地使用,但不管它“应该”如何,这就是人们所说的。 joelonsoftware.com/articles/Wrong.html
    • 再一次,Delphi 的类型系统让 Joel 的“好匈牙利语”解决的问题已经过时了。如果您想要一种与普通整数或字符串不兼容的特殊类型的整数或字符串,您可以在类型定义中使用“type”关键字声明一个,并让编译器为您捕获这些错误。
    • 不,梅森,这些仍然是分配兼容的。例如,您可以将 Double 分配给 TDateTime,反之亦然,尽管它们是两种不同的类型。 Delphi 7-2007 中的 AnsiString 和 Utf8String 也是如此。当需要另一种类型时,不允许将一种类型作为var 参数传递给函数。
    【解决方案5】:

    您的属于通用命名约定类,称为 匈牙利符号(在比通常更广泛的意义上,名称具有描述变量的前缀),但是不,您的约定不'没有更具体的名称。

    我以前从未见过您特别选择的前缀。我见过的最接近的是我认为的 Indy 约定,它使用 A 作为参数,使用 F 作为字段, G 表示全局变量,L 表示局部变量,当然还有通常的 I 表示接口,T 表示记录和类。属性和子程序没有前缀。

    【讨论】:

    • 您是从 Delphi RTL 和 Indy Source 之间的相关性中得出这个名字,还是 Borland Programmer 实际上是在 Delphi 早期从 Indy 人那里得到的东西?我没有任何早于 Delphi 7 的来源,所以我看不出有什么区别。
    • F、I 和 T 前缀几乎普遍使用,A 前缀非常常见。在全局变量和局部变量上使用前缀是我与 Indy 最相关的事情。我不知道 Borland 代码中有任何 G 或 L 前缀。
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多