如何查找匈牙利命名法前缀列表?

3
我知道编写代码有很多规范。还有一些策略工具(如FxCop)可以检查您的语句编写。
编写代码时最好使用匈牙利命名法或其他代码段,例如:
  • 以lbl开头表示标签(Label)

  • 以txt开头表示文本框(TextBox)

等等。

根据答案,使用匈牙利命名法是一个好主意吗?


1
@Nasser:微软等公司已决定永远不使用匈牙利命名法。 - John Saunders
@John 看看 MSDN 上的 Win32 文档。他们经常使用它。 - Yacoby
2
@Yacoby:是的,在Win32中。不是在.NET中。在Win32中,它是API的一部分。 - John Saunders
@Yakoby和@John,那么微软使用哪种符号表示法? - Nasser Hadjloo
@Nasser:使用where?在.NET中吗?他们没有使用前缀。如果你指的是在Win32中,那是必需的,因为它主要是一个面向弱类型语言(毕竟人们所做的转换,C++简直就像汇编语言一样)。 - John Saunders
@Yacoby 这对于古老的Win32 API是正确的。至少从2007年开始,Windows API设计准则(第3.4节标识符命名)规定不要使用匈牙利命名法,除非你正在扩展已经使用它的现有API(例如GDI),而较新的API(GDI+,DirectWrite...)则不使用。 - undefined
4个回答

9
"匈牙利命名法"一直是编程社区中争议较多的话题。Joel Spolsky在他的著名文章中为明智使用的匈牙利命名法进行了辩护,值得一读。
至于要在匈牙利命名法中使用的前缀列表:我认为没有通用的前缀列表存在,因为它们会因编程语言而异。维基百科文章列出了一些;否则,我认为你需要参考你所在领域使用匈牙利命名法的平台/框架的编码标准手册。

1
我不同意Joel的观点。如果你需要(或想要)那么多的安全性,就定义一个类型来保存每种类型的变量,并禁止它与其他任何东西之间的隐式转换。使用变量名似乎只是一种不好的方法,特别是当编译器仍然允许你在变量名定义的“类型”之间进行隐式转换时。 - Yacoby
1
@Yacoby 取决于编程语言。我目前主要从事基于 PHP 的 Web 开发(该语言不支持变量类型声明,也不是类型安全的),在这种情况下,巧妙地使用符号表示法是非常有用的,例如区分经过消毒 / 未经消毒的输入、HTML 片段、像素/颜色值等。你可以直接获得关于哪些变量或函数之间可以执行什么操作的视觉反馈。我目前正在尝试使用它,还不确定是否会长期采用,但考虑一下是值得的。 - Pekka
4
@Yacoby 这不仅仅是关于简单类型安全的问题。考虑一个包含像素宽度的变量,一个包含计数器的变量,还有一个包含百分比相对宽度的变量。所有三个变量都是完全有效的整数 - 但你不能将它们彼此组合。巧妙地应用匈牙利命名法,使用前缀如 pxcountrel(或其他),可以使错误的组合立即可见 - 特别是当应用于函数时(getWidth() 返回相对值还是像素值?)。这才是真正的好处,而不是愚蠢的类型前缀。 - Pekka
1
总的来说,我认为使用应用程序匈牙利命名法是弥补语言设计上的缺陷的一种方式,更好的解决方案是使用“更好”的语言(尽管很多时候这是不可能的)。如果Joel在文章中加入了一行关于尽可能使用语言特性而不是变量名的话,我就不会对他的文章有任何问题。 - Yacoby
1
@Pekka:解决方案是创建一个像素类型和另一个宽度类型-然后您将无法不当地混合它们,但您不必更改变量的命名方式-语言将防止不正确的访问。 - John Saunders
显示剩余4条评论

5
关于您提到的lbl和txt的例子:这不是经典的匈牙利表示法,只是前缀/命名约定。微软有一个这些的列表。摘录如下:
    Prefix    Object Type                           Example
    -------------------------------------------------------
    ani       Animation button                      aniMailBox
    cbo       Combo box and drop down list box      cboEnglish
    chk       Checkbox                              chkReadOnly
    clp       Picture clip                          clpToolbar
    cmd (3d)  Command button (3D)                   cmdOk (cmd3dOk)
    dat       Data control                          datBiblio
    dir       Directory list box                    dirSource
    dlg       Common dialog control                 dlgFileOpen
    drv       Drive list box                        drvTarget
    fil       File list box                         filSource
    frm       Form                                  frmEntry
    gau       Gauge                                 gauStatus
    gpb       Group push button                     gpbChannel
    gra       Graph                                 graRevenue
    grd       Grid                                  grdPrices
    hsb       Horizontal scroll bar                 hsbVolume
    img       Image                                 imgIcon
    ink       Pen Ink                               inkMap
    key       Keyboard key status                   keyCaps
    lbl       Label                                 lblHelpMessage
    lin       Line                                  linVertical
    lst       List box                              lstPolicyCodes
    mdi       MDI child form                        mdiNote
    mnu       Menu                                  mnuFileOpen
    opt (3d)  Option Button (3d)                    optRed (opt3dRed)
    pic       Picture                               picVGA
    pnl3d     3d Panel                              pnl3d
    shp       Shape controls                        shpCircle
    spn       Spin control                          spnPages
    txt       Text Box                              txtLastName
    tmr       Timer                                 tmrAlarm
    vsb       Vertical scroll bar                   vsbRate

@John Saunders:感谢您的通知。对我来说,Microsoft的链接没有失效。我刚刚再次检查了它,包括在其他两个浏览器(Opera和Chrome)中打开它。您是否遇到404错误?链接:http://support.microsoft.com/default.aspx?scid=KB;en-us;q110264 - Peter Mortensen
@Peter:它把我带到了他们的“智能错误”页面。现在对我也起作用了。事实上,我看到了http://support.microsoft.com/default.aspx?scid=KB;en-us;q110264#rtDisclaimer,我认为你应该在你的答案中包含它。 - John Saunders
@John Saunders:就我所看到的,这两个URL之间唯一的区别是页面中的引用“#rtDisclaimer”。这会有影响吗? - Peter Mortensen
2
这是我唯一使用任何前缀的时候 - 任何继承或派生自 ControlForm 的对象。 - IAbstract
@dboarman:为什么要使用控件或表单?如果您将控件类型从ComboBox更改为ListView,会怎样呢? - John Saunders
显示剩余3条评论

2
微软的框架设计指南中,在通用命名约定下说:

用词选择

要选择易读的标识符名称。例如,一个名为HorizontalAlignment的属性在英语中比AlignmentHorizontal更易读。

要优先考虑可读性,而不是简洁性。属性名称CanScrollHorizontally比ScrollableX(对X轴的晦涩引用)更好。

不要使用下划线、连字符或任何其他非字母数字字符。

不要使用匈牙利命名法。

匈牙利命名法是一种在标识符中包含前缀以编码有关参数的元数据的做法,例如标识符的数据类型。


6
Apps Hungarian看起来本应完全没问题。如果文档撰写者向西蒙尼(Simonyi)请求一些澄清,我认为Apps Hungarian会有更好的声誉并被更广泛接受。当然,微软本可以给Apps Hungarian更多的支持并澄清差异-而不是让Simonyi像是重新发明了Edsel一样。 - IAbstract

0

在Windows API的较低抽象级别上,Charles Petzold的(极好的)书籍《Programming Windows》对匈牙利命名法前缀有以下解释:

Prefix          Data Type
-----------------------------------------------------------------
c               char
by              BYTE (unsigned char)
n               short
i               int
x, y            int (used as x-coordinate or y-coordinate)
cx, cy          int (used as x or y length; c stands for "count")
b or f          BOOL (int); f stands for "flag"
w               WORD (unsigned short)
l               LONG (long)
dw              DWORD (unsigned long)
fn              function
s               string
sz              string terminated by 0 byte
h               handle
p               pointer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接