匈牙利表示法的好例子?

时间:2008-10-14 17:37:59

标签: naming-conventions hungarian-notation

这个问题是要寻找匈牙利表示法的好例子,所以我们可以将这些集合汇集在一起​​。

编辑:我同意匈牙利语的类型不是必需的,我希望有更具体的例子,它增加了可读性和可维护性,就像Joel在他的文章中所说的那样(根据我的回答) )。

22 个答案:

答案 0 :(得分:38)

要求匈牙利表示法的好例子的问题是,每个人都会对自己的好例子有自己的看法。我个人认为最好的Hungarian Notation没有匈牙利符号。符号最初用于表示变量的预期用法而不是其类型,但它通常用于类型信息,特别是对于Form控件(例如, txtFirstName 用于文本某人的名字的方框。)这使得代码在可读性(例如,“prepIn nounTerms prepOf nounReadability”)方面的可维护性较低,并且在需要更改类型时进行重构(在Win32 API中存在已更改类型的“lParams”)。

你应该考虑根本不使用它。例子:

  • strFirstName - 这可以只是 firstName ,因为它很明显是什么,类型并不重要,在这种情况下应该很明显。如果不是很明显,IDE可以帮助您。
  • txtFirstName - 可以更改为 FirstNameTextBox FirstName_TextBox 。它读得更好,你知道它是一个控件,而不仅仅是文本。
  • CAccount - C 用于MFC中的类名,但您确实不需要它。 帐户已经足够了。大写名称是类型的标准约定(它们只出现在特定的位置,因此不会与属性或方法混淆)
  • ixArray array 的索引) - ix有点模糊。尝试 arrayIndex
  • usState State 的不安全字符串) - 看起来像“美国国家”。最好使用状态_ UnsafeString 等。甚至可以将它包装在 UnsafeString 类中,至少使其类型安全。

答案 1 :(得分:27)

现在的经典文章,正如其他匈牙利文章所述,是来自Joel网站的文章:

http://www.joelonsoftware.com/articles/Wrong.html

答案 2 :(得分:17)

P

(用于指针)。它几乎是我使用的唯一前缀。我认为它为变量增加了很多(例如它的指针),因此应该更加尊重它。

匈牙利数据类型有点过时IDE现在可以告诉你类型是什么(只需几秒钟就悬停在变量名称上),所以它不是那么重要。但是把指针视为数据并不好,所以你要确保它对用户来说是显而易见的,即使他做出了编码时不应该做的假设。

答案 3 :(得分:15)

<强>吨

污染数据。对来自不受信任来源的所有数据进行前缀,以使该变量成为受污染的变量。在对其进行任何实际工作之前,应清除所有受污染的数据。

答案 4 :(得分:9)

使用匈牙利语表示类型是没有意义的,因为编译器已经为你做了。

匈牙利语有用的地方是区分具有相同原始类型的逻辑上不同类型的变量。例如,如果使用整数来表示坐标,则可以在x坐标前加x,y坐标为y,距离为d。所以你会有像

的代码

dxHighlight = xStart - xEnd

yHighlight = yLocation + 3

yEnd = yStart + dyHeight

dyCode = dyField * 2

等等。这很有用,因为你可以一目了然地发现错误:如果你给y添加一个dy,你总会得到一个y。如果你减去两个x,你总是得到一个dx。如果你将dy乘以标量,你总会得到一个dy。等等。如果你看到像

这样的行

yTop = dyText + xButton

你一眼就知道这是错误的,因为添加一个dy和一个x是没有意义的。编译器无法为您捕获这个,因为就它所知,您正在向int添加一个int,这很好。

答案 5 :(得分:6)

请勿使用特定语言的前缀。

我们使用:

n: Number 
p: Percentage 1=100% (for interest rates etc)
c: Currency
s: String
d: date
e: enumeration
o: object (Customer oCustomer=new Customer();)
...

我们对所有语言使用相同的系统:

SQL
C
C#
Javascript
VB6
VB.net
...

这是一个救生员。

答案 6 :(得分:5)

魔鬼的倡导者:匈牙利表示法的最好例子就是不使用它。 :d

使用现代IDE的匈牙利符号我们没有任何好处,因为他们知道类型。它在重构变量的类型时添加了工作,因为名称也必须被更改(大多数情况下,当你处理变量时,你知道它是什么类型)。

您还可以使用符号订购问题。如果你使用p作为指针而使用地址,你可以调用变量apStreet或paStreet吗?当你没有一致性时,可读性会降低,当你必须记住你必须写下符号的顺序时,你必须耗尽宝贵的思维空间。

答案 7 :(得分:5)

我发现匈牙利符号有时在动态语言中很有用。我特别想到Server Side Actionscript(基本上只是javascript),但它可以应用于其他地方。由于根本没有真正的类型信息,匈牙利语符号有时可以帮助使事情更容易理解。

答案 8 :(得分:4)

当你继承一个软件项目时,匈牙利符号(骆驼套管,就像我学到的那样)是非常宝贵的。

是的,你可以用你的IDE“悬停”一个变量,找出它是什么类,但是如果你正在翻阅数千行代码,你不想在几秒钟内停止 - 每一个......单身......时间....

请记住 - 您不是为您或您的团队单独编写代码。你也是为那些必须在未来2 - 5年内拿起这段代码并加强它的人写的。

答案 9 :(得分:4)

我强烈反对匈牙利语,直到我真正开始阅读并尝试理解它的原始意图 在阅读了Joels的帖子“错误”和文章“重新发现匈牙利表示法”后,我真的改变了主意。做得正确我相信它必须极其强大。

Joel Spolsky的错误 http://www.joelonsoftware.com/articles/Wrong.html

重新发现匈牙利表示法
http://codingthriller.blogspot.com/2007/11/rediscovering-hungarian-notation.html

我相信大多数反对者从来没有真正尝试过,也没有真正理解它。 我很乐意在一个真实的项目中试一试。

答案 10 :(得分:4)

唯一真正有用的匈牙利人是m_成员变量。 (我也使用sm_作为静态成员,因为那是仍然存在的“其他”范围。)对于宽带监视器和编译器,它们需要80亿字符长的变量名称,缩写类型名称是不值得的。

答案 11 :(得分:3)

我认为从上面链接的Joel的文章和一般的匈牙利符号中删除关键的一点就是在变量不明显的时候使用它。

本文中的一个例子是编码与非编码字符串,并不是你应该使用匈牙利语'us'表示不安全的字符串而使用's'表示安全字符串,而是你应该使用 some 标识符,表示字符串是否安全。如果它成为标准,则很容易看出标准何时被破坏。

答案 12 :(得分:2)

我发现唯一有用的一点是在声明接口控件时,txtUsername,txtPassword,ddlBirthMonth。它并不完美,但它有助于大型表格/项目。

我不会将它用于变量或其他项目,只是控件。

答案 13 :(得分:2)

除了使用'p'作为指针外,我喜欢用'cb'和'cch'来表示缓冲区大小参数(或变量)是字节数还是字符数(我是也见过 - 很少 - 'ce'用于表示元素的数量)。因此,前缀不是传达类型,而是传达使用或意图。

我承认,我不会像我应该的那样使用前缀,但我喜欢这个主意。

答案 14 :(得分:2)

我同意匈牙利的符号不再特别有用。我认为它的初衷是指示不是数据类型,而是实体类型。例如,在涉及客户,员工和用户名称的代码部分中,您可以命名本地字符串变量cusName,empName和usrName。这有助于区分听起来相似的变量名称。在整个应用程序中将使用相同的实体前缀。但是,当使用OO并且您正在处理对象时,这些前缀在Customer.Name,Employee.Name和User.Name中是多余的。

答案 15 :(得分:2)

<强>米

使用ORM(例如hibernate)时,您倾向于处理托管和非托管对象。更改托管对象将反映在数据库中而不调用显式保存,而处理管理对象则需要显式保存调用。你如何处理对象将取决于它是什么。

答案 16 :(得分:2)

变量的名称应该描述它是什么。良好的变量命名使得匈牙利符号无用。

但是,除了良好的变量命名之外,有时你还会使用匈牙利表示法。 m_numObjects有两个“前缀:”m_和num。 m _ 表示范围:它是与相关联的数据成员。 num 表示的值

当我阅读“好”代码时,即使它确实包含一些“匈牙利语”,我也不会感到受阻。右:我看了代码,我没有点击它。 (事实上​​,我在编码或任何特定于voodoo编程的查找功能时都不会使用鼠标。)

当我读m_ubScale(是的,我正在看着你,Liran!)之类的东西时,我感到很慢,因为我必须看看它的用法(没有评论!)来找出什么它可以扩展(如果有的话)和它的数据类型(恰好是一个定点char)。更好的名称是m_scaleFactor或m_zoomFactor,注释作为定点数,甚至是typedef。 (事实上​​,typedef会很有用,因为有几个类的其他成员使用相同的定点格式。但是,有些不会,但仍然标记为m_ubWhatever!令人困惑,至少可以说。)< / p>

我认为匈牙利语应该是变量名称的添加剂,而不是信息的替代品。此外,很多时候匈牙利语符号对变量的可读性,浪费字节和读取时间都没有任何补充。

只是我的2¢。

答案 17 :(得分:2)

一个非常古老的问题,但这里有一些我经常使用的“匈牙利”前缀:

  

     

用于局部变量,以区分名称在全局上下文中可能有意义的位置。如果你看到myFoo,它只会在这个函数中使用,不管我们在其他任何地方使用Foos做什么。

myStart = GetTime();
doComplicatedOperations();
print (GetTime() - myStart);

  

<强> TMP

     

用于循环或多步操作中的值的临时副本。如果你看到两个tmpFoo变量相互之间有几行,那么它们几乎肯定是无关的。

tmpX = X; 
tmpY = Y;
X = someCalc(tmpX, tmpY);
Y = otherCalc(tmpX, tmpY);

有时出于类似的原因 tmp ,通常在较长的循环或函数中。

答案 18 :(得分:1)

我只使用p作为指针,就是这样。只有当我使用C ++时才会这样。在C#我不使用任何匈牙利表示法。 e.g。

MyClass myClass;
MyClass* pMyClass;

这就是全部:)

编辑哦,我刚才意识到这是谎言。我也使用“m_”作为成员变量。 e.g。

class
{
private:
bool m_myVar;
}

答案 19 :(得分:1)

好吧,我只在窗口控制变量中使用它。我使用btn_,txt_,lbl_等来发现它们。我还发现通过键入其类型(btn_ etc)来查找控件的名称会很有帮助。

答案 20 :(得分:0)

我发现自己使用'w'代表'working',作为前缀而不是'temp'或'tmp',用于本地变量,这些变量只是为了追踪数据,例如:

Public Function ArrayFromDJRange(rangename As Range, slots As Integer) As Variant

' this function copies a Disjoint Range of specified size into a Variant Array 7/8/09 ljr

Dim j As Integer
Dim wArray As Variant
Dim rCell As Range

wArray = rangename.Value ' to initialize the working Array
ReDim wArray(0, slots - 1) ' set to size of range
j = 0

For Each rCell In rangename
    wArray(0, j) = rCell.Value
    j = j + 1
Next rCell

ArrayFromDJRange = wArray

End Function

答案 21 :(得分:0)

没有匈牙利乐谱的好例子。只是不要使用它。即使您使用的是弱类型语言也不行。你会过得更开心。

但如果你真的需要一些不使用它的理由,这是我最喜欢的一个,摘自this great link

匈牙利表示法中的一个跟随技巧是“更改变量的类型但保持变量名称不变”。这几乎总是在Windows应用程序中完成,从Win16迁移: - WndProc(HWND hW,WORD wMsg,WORD wParam,LONG lParam)到Win32 WndProc(HWND hW,UINT wMsg,WPARAM wParam,LPARAM lParam)其中w值提示他们是言语,但他们真的是指多头。当参数将是64位宽时,这种方法的真正价值在Win64迁移中变得清晰,但旧的“w”和“l”前缀将永远保留。