我苦苦挣扎的一件事就是不使用匈牙利符号。我不想仅去查看变量类型是什么,就不必去定义变量。当项目扩展时,能够查看以'bool'为前缀的变量并知道它正在寻找true / false而不是0/1值是很高兴的。

我也做了一个SQL Server中的大量工作。我在存储过程中添加了“ sp”前缀,在表中添加了“ tbl”前缀,更不用说我数据库中的所有变量了。

我到处都看到没人真正想要使用匈牙利表示法来他们避免它的地步。我的问题是,不使用匈牙利表示法的好处是什么?为什么大多数开发人员都像瘟疫一样避免使用它?

评论

您使用哪种语言/ IDE?在Visual Studio中,您不必去定义就知道变量的类型,因为IDE会为您提供它。在不强制使用类型的语言(例如PHP)中,您不需要经常知道类型(因为您可以将0或1分配给布尔值)。

@MainMa我不确定这是不知道PHP中值类型的一个好理由。

“当项目扩大时”……没关系。在任何时候,作用域中只应包含少量变量:少数几个类变量,以及少数几个方法参数。如果无法保持它们笔直,则类太大或方法太长。匈牙利符号是为Windows C编程而发明的,基本上是作为可怕的Windows API的一种解决方法。从未有人建议或想要进行Unix开发。

想到不使用匈牙利符号“不被同事讨厌”的好处是什么...

adj匈牙利符号与adj硬性准备bRead。

#1 楼

由于其原始意图(请参阅http://www.joelonsoftware.com/articles/Wrong.html和http://fplanque.net/Blog/devblog/2005/05/11/hungarian_notation_on_steroids)已经被误解了,并且已经被( ab)用于帮助人们记住他们使用的语言不是静态类型的变量的类型。在任何静态类型的语言中,您不需要添加前缀镇流器即可告诉您变量是什么类型。在许多无类型的脚本语言中,它可以提供帮助,但是经常被滥用,以至于变得完全笨拙。不幸的是,人们没有回到匈牙利表示法的初衷,而是将其变成了应避免的“邪恶”事物之一。语义。例如,如果您具有屏幕坐标(左,上,右,下),则可以将带有绝对屏幕位置的变量以“ abs”作为前缀,以相对于窗口的位置的变量以“ rel”作为前缀。这样,当您将相对坐标传递给需要绝对位置的方法时,对于任何读者来说都是显而易见的。应避免像瘟疫一样使用该版本,因为:


它会使命名变得复杂。当(ab)使用匈牙利表示法时,将始终存在关于前缀的具体程度的讨论。例如:listboxXYZMyParticularFlavourListBoxXYZ
它使变量名更长,而无助于理解变量的用途。
为了避免长前缀将其缩短为缩写,并且您需要一本字典来了解每个缩写的含义时,这样做会打败练习的目的。 ui是无符号整数吗?未引用的计数接口?与用户界面有关?这些事情可能会变得很长。我已经看到超过15个看似随机的字符的前缀,这些前缀应该传达var的确切类型,但实际上只是mystify。
它很快就过时了。当您更改变量的类型时,人们总是(lol)忘记更新前缀以反映更改,或故意不更新它,因为那样会在使用var的任何地方触发代码更改...
这会使情况变得复杂谈论代码,因为它是“ @g”。说:带有匈牙利符号的变量名称通常是很难发音的字母汤。这会妨碍可读性和讨论代码,因为您不能“说出”任何名称。
...还有很多我现在不记得的名称。也许是因为我很高兴不必长时间处理滥用的匈牙利符号...


评论


@ Surfer513:实际上,命名控件时我更喜欢后缀。对我而言,找到所有处理特定主题/方面的控件比找到所有编辑控件要有趣得多。当我想找到用户可以在其中键入客户名称的控件时,我将开始寻找客户端而不是txt,因为它可能不是txt(编辑),而是备忘录或richedit或...。甚至可以是组合框,以允许在以前输入的客户端名称中找到它。

– Marjan Venema
11年8月21日在19:06



@ Surfer513:如今,我倾向于仅在区分处理相同内容的两个控件时使用后缀。例如,标签和客户名称的编辑。通常,后缀与控件的类型无关,而与控件的用途相关:例如ClientCaption和ClientInput。

– Marjan Venema
11年8月21日在19:11



还值得注意的是,VS 2010中的intellisense允许您搜索整个名称,而不仅仅是搜索开头。如果将控件命名为“ firstNameTextBox”并键入“ textb”,它将找到您的控件并将其列出。

–亚当·罗宾逊(Adam Robinson)
11年8月21日在19:58

“……避免了像牙菌斑一样的滥用版本……”也就是说,避免了比牙垢和牙龈炎少一点的情况? ;-)

– Ben Mosher
2011年8月21日在23:21

@Marjan:当然,编译器可以选择此方法。如果每个单位都用一种类型表示,那么您就不会不小心将一个单位传递给另一个单位。在这里,如果您具有AbsoluteXType和RelativeYType,则不会错误地将Y相对坐标传递给X绝对坐标。我更喜欢代表不兼容实体的变量为不兼容类型,而不是具有不兼容前缀。编译器不关心前缀(或后缀)。

– Matthieu M.
2011年8月22日在8:44

#2 楼

匈牙利表示法是现代编程环境和重言式形式中的一种命名反模式。

它无用地重复信息,无济于事,并且增加了维护费用。当您将int更改为long之类的其他类型时会发生什么,现在您必须搜索并替换整个代码库以重命名所有变量,否则它们现在在语义上是错误的,这比没有在类型中重复类型的情况更糟。名称。

它违反了DRY原理。如果必须在数据库表前加上缩写词以提醒您它是一个表,那么您在语义上的命名方式肯定不够。您执行此操作的其他所有内容也是如此。在现代开发环境中,这只是多余的打字和工作而不会带来任何收益或收益。

评论


“当您将int更改为long类型的其他类型时会发生什么……”简单:不要更改名称,因为没有告诉您更改将在多少地方产生波动。现在您有了一个匈牙利语名称与其实现冲突的变量。绝对没有办法告诉您,如果变量/函数具有公共可见性,那么更改名称的后果将是多么广泛。

–David Hammen
2011年8月22日在0:41



链接的文章很棒,值得一读。 +1

–马蒂·皮特(Marty Pitt)
11年8月22日在4:19

@David只是看着Win32 API,其中充满了变量,参数甚至方法名称,这些名称使用匈牙利表示法(MS要求)表示实际上是32位的8位或16位值自从1994年(大约17年前)引入Windows 95以来,我们一直保持着价值观。

– jwenting
2011年8月22日下午5:43

@Secure:我认为这就是自动化测试应该做的。不是程序员。

–乔尔
11年8月22日在17:14

@Secure可能不在内部应用程序中,但是如果要维护Windows API这样的公共API,这是一个主要问题。

– jwenting
2011年8月23日下午6:41

#3 楼

维基百科列出了匈牙利符号的优缺点,因此可以为这个问题提供最全面的答案。值得注意的观点也是一个很有趣的读物。

不使用匈牙利符号的好处基本上只是避免了它的缺点:




当编译器进行类型检查时,匈牙利表示法是多余的。提供类型检查的语言编译器可确保变量的使用自动与其类型一致;
所有现代的集成开发环境都按需显示变量类型,并自动标记使用不兼容类型的操作,从而使该表示法过时。
匈牙利表示法在出现混乱时它用于表示几个属性,如a_crszkvc30LastNameCol中所示:一个常数引用参数,用于保存类型为LastName的数据库列varchar(30)的内容,该内容是表的主键的一部分。
修改或移植代码时,可能导致不一致。如果更改了变量的类型,则变量名称上的修饰符将与新类型不一致,或者必须更改变量的名称。一个特别知名的示例是标准的WPARAM类型,以及许多Windows系统函数声明中随附的wParam形式参数。 “ w”代表“单词”,其中“单词”是平台硬件体系结构的本机单词大小。它最初是16位字体系结构上的16位类型,但后来在更高版本的操作系统中更改为32位字体系结构上的32位,或在64位字体系结构上更改为64位类型。原始名称(其真正的基础类型是UINT_PTR,即,一个足以容纳指针的无符号整数)。语义上的阻抗以及由此引起的程序员从平台到平台的混乱和不一致,是基于“ w”在那些不同的环境中代表16位的假设。
大多数时候,知道变量的使用意味着知道它的类型。此外,如果不知道变量的用法,就不能从变量的类型中推导出来。
匈牙利表示法大大降低了使用功能丰富的代码编辑器支持变量名补全的好处,因为程序员可以首先输入整个类型说明符。
通过使用不必要的类型和作用域前缀来混淆变量的用途,使代码的可读性降低。
附加的类型信息可能不足以替代更具描述性的名称。例如。 sDatabase不会告诉读者它是什么。 databaseName可能是更具描述性的名称。
如果名称具有足够的描述性,则其他类型信息可能是多余的。例如。 firstName很可能是字符串。因此,将其命名为sFirstName只会使代码混乱。



我自己不使用此表示法,因为我不喜欢不必要的技术噪音。我几乎总是知道我要处理哪种类型,并且我想在域模型中使用干净的语言,但是我主要使用静态和强类型的语言编写。

评论


这应该是正确的答案。挺好的。 +1

– Saeed Neamati
2011年8月21日在20:51

你太客气了赛义德我很感谢您的赞赏,但是关于这个问题的其他答案也很好。

–猎鹰
2011年8月21日在21:34

仅用一句话来表示:“大多数时候,知道变量的使用就意味着知道变量的类型。此外,如果不知道变量的用法,就不能从变量的类型中推论得出。” -恕我直言,这是避免匈牙利语表示法的#1原因。

–丹尼尔·普赖登(Daniel Pryden)
11年8月22日在18:49



#4 楼

作为MS SQL Server特定的问题:


首先在Master数据库中搜索所有带有'sp_'前缀的存储过程,而不是在其中创建数据库。
将导致存储过程的执行延迟。


评论


+1获取一些非常酷的信息。我将“ sp”用作存储的proc前缀,而不是“ sp_”。但是,所有这些绝对是一个非常非常有趣的事实,也是不使用'sp_'作为存储的proc前缀的具体原因。

–user29981
2011年8月21日在17:56

+1我从不知道这一点,当我开始使用SQL Server时,我在工作场所使用的所有SP都以sp_为前缀,因此我只遵循约定。

–迈克尔
11年8月21日在19:42

很好,但是与这个问题无关(使用sq而不是_sp)。这就像为不在默认架构中的对象省略架构名称一样。

– JeffO
11年8月22日在13:54

对于用户存储过程,我通常使用“ usp_”。这有助于避免上述问题,并为读者区分存储是系统还是用户。

–伞
13年6月24日在13:50

#5 楼

IMO不使用匈牙利语的最大好处是,它迫使您使用有意义的名称。如果正确命名变量,则应该立即知道它是什么类型,或者能够在任何设计良好的系统中快速推断出它。如果您需要依靠strbln或更差的所有obj前缀来知道变量是什么类型,我会认为这表明了命名问题-要么变量名太差,要么太通用而无法传达含义。

具有讽刺意味的是,从个人经验来看,我看到匈牙利人使用的主要方案是“货物崇拜”编程(即其他代码正在使用它,所以让我们继续使用它仅仅是因为)或在VB.NET中解决实际上,语言是不区分大小写的(例如,因为您不能使用Person oPerson = new Person,而Person person = new Person太模糊了,所以Person p = new Person太模糊了);在那种特殊情况下,我还看到在“ the”或“ my”前面加上前缀(例如Person thePerson = new Person或较丑的Person myPerson = new Person)。

我将添加唯一的匈牙利语使用时间ASP.NET控件,这实际上是一个选择问题。与简单的TextBoxCustomerName相比,键入CustomerNameTextBoxtxtCustomerName非常丑陋,但即使那样也感觉“肮脏”。我觉得应该为控件使用某种命名约定,因为可以有多个控件显示相同的数据。

#6 楼

自从您提到它以来,我将仅关注SQL Server。我认为没有理由将“ tbl”放在桌子前。您可以查看任何tSQL代码,并根据使用方式区分表。您永远不会像UDF或Select from stored_procedure.这样的存储过程那样Select from table(with_param)Execute tblTableOrViewName

表可能会与View混淆,但是涉及到如何使用它们;没有区别,那有什么意义呢?匈牙利符号可以为您节省在SSMS中查找表格(在表还是视图下?)的时间,仅此而已。

变量可能会带来问题,但实际上需要声明它们,您打算使用一个变量距您的声明语句多远?除非您要编写很长的过程,否则滚动几行就没什么大不了的。分解冗长的代码可能是个好主意。

您所描述的是一种痛苦,但是匈牙利表示法解决方案并不能真正解决问题。您可以查看其他人的代码,发现变量类型可能会更改,现在需要更改变量名称。只是要忘记的一件事。而且,如果我使用VarChar,则无论如何都要看一下声明语句来知道大小。描述性名称可能会让您更进一步。 @PayPeriodStartDate几乎可以自我解释。

评论


@Surfer:主键有所不同,因为“ PK”不是类型; “ PK_TableName”说“这是TableName的主键”,而不是“这是PK类型的TableName”。至于其余的……听起来好像您不是真的在这里听论点。请停止使用这种可恶的做法,直到今天,这种做法仍在降低所有代码的总体质量。

– Aaronaught
2011年8月21日在20:12

@Aaronaught,您正在指定匈牙利表示法的一个方面(en.wikipedia.org/wiki/Hungarian_notation)。它不仅是类型,而且是预期用途。因此,以“ pk”作为主键的前缀实际上是匈牙利表示法。我在这里听论点,但有一些例外(例如主键情况)似乎对HN有益。也许吧,也许不是。在所有情况下,我仍在尽力而为。我今天已经学到了很多,并引发了一些伟大的想法。

–user29981
2011年8月21日在20:34

@Surfer:那根本不正确。匈牙利表示法描述类型(错误版本)或该类型的特殊用法(错误程度较小)。 PK既不是,也不是简单描述类型,而是描述行为。当我说一个年龄时,它恰好是整数是完全没有意思的,但是当谈论数据库约束时,“表X的主键”正是重要的。

– Aaronaught
2011年8月21日在20:45

我喜欢你倒数第二段。我公司使用匈牙利表示法的理由是“它使我们能够快速查看哪些变量是全局变量,哪些不是全局变量”。然后,您查看变量声明,每个文件有300个变量,有些m *表示模块化(全局),有些v *表示局部,即使它们在模块化水平上也被拒绝。 “哦,那是因为它们只是打算用作本地人,而不是模块化的。”面容

– corsiKa
11年8月21日在21:26

@Aaronaught:在我当前的项目中,我们使用以tbl_为前缀的表名。尽管我不是这种做法的忠实拥护者,但是我看不到这是如何“降低所有代码的集体质量”的。你能举个例子吗?

–特雷布
11年8月22日在13:19

#7 楼

要补充的另一件事是,对于.NET这样的整个框架,您将使用什么缩写?是的,要记住btn代表一个按钮而txt代表一个文本框非常简单。但是,对于诸如StringBuilder之类的东西,您有什么想法? strbldCompositeWebControl怎么样?您是否使用过这样的东西:

CompositeWebControl comWCMyControl = new CompositeWebControl();


匈牙利符号的低效率之一是,通过拥有越来越大的框架,事实证明,不仅增加了额外的框架,好处,但也为开发人员增加了更多的复杂性,因为他们现在必须越来越多地学习非标准前缀。

#8 楼

就我看事物的方式而言,匈牙利表示法是绕过功能不够强大的类型系统的k俩。在允许您定义自己的类型的语言中,创建一个新类型来对您期望的行为进行编码的过程比较简单。在Joel Spolsky对匈牙利表示法的咆哮中,他举例说明了变量或函数不安全(我们)或安全(一个或多个),但仍依靠程序员进行目视检查,以此举例说明了可能的XSS攻击。如果您有一个可扩展的类型系统,则可以只创建两个新类型UnsafeString和SafeString,然后在适当时使用它们。另外,encode类型变为:

SafeString encode(UnsafeString)


而无法访问UnsafeString的内部结构或使用某些其他转换函数成为从UnsafeString获取数据的唯一方法到SafeString。如果所有输出函数仅使用SafeString实例,就无法输出未转义的字符串[禁止使用带有诸如StringToSafeString(someUnsafeString.ToString())之类的转换的恶作剧]。为什么让类型系统进行完整性检查优于尝试手动进行代码检查,或者在这种情况下,也许是费力的检查。一个int是一个int是一个int,对此您无能为力。您总是可以玩带有结构的游戏,但是是否有改进尚值得商.。

关于匈牙利表示法的其他解释,即I.E.以变​​量的类型为前缀,这简直是愚蠢的,它鼓励像命名变量uivxwFoo这样的懒惰做法,而不是像countOfPeople这样有意义的事情。

评论


如何声明一个.NET或Java类型来描述“可以自由修改但永远不会共享的int []”或“只能在永不修改它的事物之间自由共享的” [int []”?如果int []字段foo封装了值{1,2,3},可以不知道它表示int []的哪种“类型”而使其封装{2,2,3}吗?我认为,如果在没有类型系统支持的情况下,Java和.NET至少采用一种命名约定来区分这些类型,那就更好了。

–超级猫
2014年5月6日21:13

#9 楼

在静态类型的语言中,匈牙利表示法几乎完全没有用。这是一项基本的IDE功能,它可以通过将鼠标放在变量上或通过其他方式来显示变量的类型。此外,如果没有类型推断,则可以通过在声明位置几行来了解类型。类型推断的重点是不要到处重复类型的干扰,因此在使用类型推断的语言中,匈牙利表示法通常被视为一件坏事。

在动态类型化语言中,它可以帮助有时,但是对我来说,这感觉很独特。您已经放弃了只限于确切的域/共域的功能;如果所有变量都用匈牙利符号命名,那么您只是在重现类型系统将给您的内容。如何表达匈牙利表示法中的整数或字符串形式的多态变量? “ IntStringX”? “ IntOrStringX”?我曾经用过匈牙利符号的唯一地方是汇编代码,因为我正试图找回如果我拥有类型系统会得到的东西,这是我编码过的第一件事。

无论如何,我不太在乎人们用什么来命名变量,代码可能仍然会令人难以理解。开发人员在样式和变量名称之类的东西上浪费了太多时间,最终,您仍然会获得大量使用不同语言约定的库。我正在开发一种符号(即非基于文本的)语言,其中没有变量名称,只有唯一的标识符和变量的建议名称(但是大多数变量仍然没有建议名称,因为根本不存在用于变量的合理名称)他们);审核不受信任的代码时,您不能依赖变量名。

评论


对于大多数动态类型的语言来说,它也毫无用处!

–詹姆斯·安德森(James Anderson)
2011年8月22日,下午2:11

对于IDE来说,它比手动编码还要糟糕,因为这意味着代码完成速度大大降低。如果您有100个整数变量,则输入int (例如)将显示100个项目以进行滚动。如果您需要的是intVeryLongVariableName,则代码补全会出现问题。如果没有匈牙利语,则只需输入very ,并且只有1或2个选项。

– jwenting
2011年8月22日下午5:46

#10 楼

在这种情况下,像往常一样,我会在阅读其他参与者的答案之前发布答案。

我在您的视野中看到三个“错误”:

1)如果您想了解变量/参数/属性/列的类型,可以将鼠标悬停在单击它,它将在大多数现代IDE中显示。我不知道您在使用什么工具,但是上次我被迫在没有提供此功能的环境中工作是在20世纪,语言是COBOL,哎呀,它不是Fortran,而我的老板不明白我为什么离开。

2 /在开发周期中类型可能会改变。 32位整数在某些时候可能会变成64位整数,这是由于项目开始时未检测到的充分原因。因此,将intX重命名为longX或使用指向错误类型的名称保留它是不好的业力。

3)实际上,您要的是多余的。冗余不是很好的设计模式或习惯。甚至人类都不愿过多地冗余。甚至人类都不愿过多地冗余。

评论


我了解高级/现代IDE,我完全同意。但是数据库设计呢?假设您有一列或存储过程参数。将鼠标悬停在那种事情上并不能真正起作用。您必须查看表/存储的proc定义。你为此做什么?

–user29981
2011年8月21日在23:54

#11 楼

我认为迫切需要匈牙利语是一种症状。
全局变量过多的症状...或者函数太长而无法维护。

如果您的变量定义是'通常情况下,您会遇到麻烦。
如果您的函数没有遵循令人难忘的约定,那么麻烦就很大了。

...这很...我想为什么许多工作场所会把它弄破。

它起源于需要它的语言。
在全局变量盛行的时代。 (由于没有其他选择)
它对我们很有用。

我们今天唯一真正的用途是Joel Spolsky。
跟踪变量的某些特定属性,就像它的安全性一样。

(例如,“变量safeFoobar是否可以通过绿灯插入SQL查询吗?
,因为它称为safe,是”))

其他一些答案还涉及编辑器功能,这些功能有助于您在变量上悬停时查看变量的类型。在我看来,这些对于代码的合理性也是有问题的。我相信它们只是用于重构,还有许多其他功能(例如功能折叠),不应在新代码上使用。

#12 楼

之所以避免使用它,是因为系统匈牙利人违反了DRY(前缀恰好是编译器和(好的)IDE可以派生的类型)。

应用匈牙利O.T.O.H。使用变量的前缀(即scrxMouse是屏幕上的ax坐标,它可以是int,short,long甚至是自定义类型(typedef甚至允许您轻松更改它))

对制度的误解是摧毁匈牙利人的最佳做法

评论


我必须不同意-摧毁匈牙利人的“最佳做法”的是,它从来没有接近最佳(甚至是好的)做法。

–杰里·科芬(Jerry Coffin)
2011年8月21日在18:40

@haylem:我看过文章和Simonyi的原始论文,并阅读了代码。从每种角度看,这都是一个坏主意,它永远都不会消失。

–杰里·科芬(Jerry Coffin)
2011年8月21日在20:01



它不一定会以动态语言违反DRY。这只是单字。干燥不一定总是好的。例如:C宏。

– Longpoke
2011年8月21日在20:50

国际海事组织将匈牙利语“摧毁”的事实是,与使用描述性名称相比,即使是“意图”也没有用,尽管公平地说,匈牙利语创建时就没有可读代码的动向...

–韦恩·莫利纳(Wayne Molina)
11年8月22日在13:20

@Wayne M:当编译器本质上允许您使用变量名称的论文时,“描述性名称”很容易说出来。当标识符名称的长度实际上被限制为一个很小的任意值时(我认为通用限制是在不久之前的八个或十个字符;我确实记得,Borland Turbo C 2甚至为标识符名称的最大长度!),在名称中编码有用的信息有点棘手...

–用户
2011年8月22日14:20

#13 楼

我认为不使用匈牙利符号的原因已被其他海报很好地涵盖了。我同意他们的意见。

对于数据库,我对DDL对象使用匈牙利表示法,而DDL对象很少在代码中使用,否则会在命名空间中发生冲突。主要是归结为前缀索引和命名约束及其类型(PK,UK,FK和IN)。使用一致的方法来命名这些对象,并且应该能够通过查询元数据来运行一些验证。

评论


当我有一个ID表时,通常会遇到这种情况。如果我有表SomeStringById(int somestringId,varchar somestring),则其索引在逻辑上也将是SomeStringById,但这会导致冲突。所以我称它为idx_SomeStringById。然后,为了效仿,我将执行idx_SomeStringByValue只是因为将idx_放在一个而不是另一个上是很愚蠢的。

– corsiKa
11年8月22日在18:53

#14 楼

我发现有很多反对的理由,但我却没有看到:人机工程学。

以前,当您只需要字符串,int,bool和float时,sibf字符就足够了。但是使用字符串+短时,问题就开始了。使用全名作为前缀,还是使用str_name作为字符串? (尽管名称几乎总是字符串-是吗?)Street类是什么?名称变得越来越长,即使使用CamelCase,也很难说出类型前缀在哪里结束以及变量名在哪里开始。

 BorderLayout boderLayoutInnerPanel = new BorderLayout ();
 panelInner.addLayout (borderLayoutInnerPanel);


好的-如果您还没有使用下划线,则可以使用下划线;如果使用了很长时间的下划线,则可以使用CamelCase:
 BorderLayout boderLayout_innerPanel = new BorderLayout ();
 panel_inner.addLayout (borderLayout_innerPanel);

 Border_layout boder_layoutInner_panel = new Border_layout ();
 panelInner.add_layout (border_layoutInner_panel);


这太可怕了,如果这样做,您将拥有

 for (int iI = 0; iI < iMax-1; ++iI)
     for (int iJ = iI; iJ < iMax; ++iMax) 
          int iCount += foo (iI, iJ); 


要么您要么使用无用的前缀结尾对于琐碎的情况,例如循环变量或count。您最近是什么时候使用空头或空头来进行交易的?如果您设置例外,则通常会浪费时间,考虑是否需要前缀。

如果您有很多变量,通常在IDE的对象浏览器中将它们分组。现在,如果40%的整数以i_开头,而s_的字符串以40%开头,并且它们按字母顺序排序,则很难找到名称的重要部分。

#15 楼

假设我们有一个这样的方法(在C#中):

int GetCustomerCount()
{
    // some code
}


现在在代码中我们这样称呼它:

var intStuff = GetCustomerCount();
// lots of code that culminates in adding a customer
intStuff++;


int并不能告诉我们很多。仅仅是int的事实并不能告诉我们其中包含什么。现在,让我们假设我们这样称呼它:

var customerCount = GetCustomerCount();
// lots of code that culminates in adding a customer
customerCount++;


现在我们可以看到变量的用途了。难道我们知道它是整数吗?

匈牙利语的初衷是让您执行以下操作:

var cCustomers = GetCustomerCount();
// lots of code that culminates in adding a customer
cCustomers++;


这很好,只要您知道c代表什么。但是您必须有一个标准的前缀表,每个人都必须了解它们,任何新手都必须学习它们才能理解您的代码。乍一看,customerCountcountOfCustomers相当明显。

匈牙利人在存在Option Strict On之前就已经在VB中使用了某种用途,因为在VB6和更早的版本中(以及在带有Option Strict Off的VB .NET中),VB会强制转换类型,所以您可以做到这一点:

Dim someText As String = "5"
customerCount = customerCount + someText


这很不好,但是编译器不会告诉您。因此,如果您使用匈牙利语,那么至少您会知道所发生的情况:

Dim strSomeText As String = "5"
intCustomerCount = intCustomerCount + strSomeText  // that doesn't look right!


在.NET中,使用静态类型时,这不是必需的。匈牙利人经常被用来代替良好的命名。忘记匈牙利语,取而代之的是好名字。

#16 楼

我仍然经常使用匈牙利语或类似的后缀的地方是在上下文中,相同的语义数据以两种不同的形式出现,例如数据转换。这可能是在存在多个度量单位或存在多种形式(例如字符串“ 123”和整数123)的情况下。

我发现此处给出的不使用它的原因令人信服不将匈牙利语强加于其他人,而只是暗示性地决定自己的做法。

程序的源代码本身就是一个用户界面-向维护者显示算法和元数据-用户界面中的冗余是一种美德,而不是一种罪过。参见“日常事物的设计”中的图片,并查看标有“推”字样的门,就像拉动它们一样,并查看操作人员砍下重要的核反应堆控制装置的啤酒水龙头,因为它们“悬停在它们在IDE中还不够好。

“仅在IDE中悬停”并不是不使用匈牙利语的原因-只是某些人可能认为它没有用的原因。您的里程可能会有所不同。

当变量类型更改时,匈牙利人会承受巨大的维护负担这一想法很愚蠢-您多久更改一次变量类型?此外,重命名变量很容易:


只需使用IDE重命名所有事件。 -Gander,回覆Goose。



如果匈牙利语确实可以帮助您快速查看一段代码并可靠地维护它,请使用它。如果没有,那就不要。如果其他人告诉您您对自己的经历有误,我建议他们可能是错误的人。