努力不使用匈牙利符号


10

我见过支持和反对匈牙利系统的争论。多年来,我一直在使用该系统的旧项目上工作,方法是命名每个变量,并使用变量类型的前缀(例如(strName,intAge,btnSubmit等))进行命名(我知道原始的匈牙利应用前缀是变量,而不是类型)。我希望我的下一个项目完全放弃它,但是我确实发现很难不借助它来唯一地命名类似的东西。

可以说我有一个用于收集电子邮件地址并将其存储在数据库表中的网络表单,还有一个按钮,它调用了将地址保存到数据库的函数。

如果我使用的是匈牙利风格符号,则可以将该框txtEmail称为按钮,btnEmail并将其称为textbox中包含的值strEmail。然后,我可能会使用一个功能storeEmail(strEmail)来存储电子邮件。我这里有一个明确的约定,很明显每个变量是什么。

命名这些变量的最佳实践是什么

  • 不求助于匈牙利系统
  • 而不会使它们长时间或令人困惑
  • 并在整个项目中使用明确的约定?

2
如果您在查找唯一名称时遇到困难,那么其余的命名约定或函数的大小可能有问题。

您正在使用什么技术?这些前缀似乎适合于Web窗体。
StuperUser 2011年

我正在使用ASP.NET(后面带有C#)
fearoffours 2011年

@delnan-您能详细说明吗?为什么函数大小使唯一命名更容易?
fearoffours 2011年

@fearofours:较小的函数需要较少的变量,而较少的变量显然意味着较少的变量冲突。当然,这假定您将每个变量都放在尽可能小的范围内。

Answers:


8

最后一点是最重要的-无论您做什么,都需要在整个项目中以及与同事保持一致。实现一致性的主要方法有两种,如果可能,应同时使用两种方法。首先使用工具在构建时检查命名约定。在.Net世界中,StyleCop将是此类工具的一个很好的例子。获得一致性的第二种方法是对所有代码进行同行评审,以便所有人都可以保持警惕。

您的其他两点似乎在询问替代方案。我不确定您是否需要替代方案;关于匈牙利语不再流行的要点是,当类型系统和工具稍微严格一点时,它曾经被用来描述类型。也就是说,如果您使用C语言进行编程,并且传递指针来跟踪该类型,则唯一的方式就是使用匈牙利语。现在,如果您使用的是C#或Java之类的语言,则不会使用指针(或很少使用),因此不再需要任何匈牙利语。另外,现代IDE可以通过将鼠标悬停在变量上来轻松查看类型,或者在最坏的情况下使用一些快捷方式来查看原始声明。因此,我认为您不需要任何表示法,只需按变量的功能命名即可。如果是电子邮件地址,请使用“电子邮件”或“


2
当表单/页面/窗口/任何具有用于电子邮件的按钮,用于电子邮件的文本框,以及可能用于电子邮件的另一个小部件/控件时,都会变得有些棘手
FrustratedWithFormsDesigner

7
@FrustratedWithFormsDesigner不一定。文本框可以是emailAddressInput,其中按钮是emailAddressSubmit,内部表示就是emailAddress。
乔纳森

@乔纳森:好点。
FrustratedWithFormsDesigner

3

在处理Web表单/ Windows表单/其他图形对象时,使用Systems Hungarian是有意义的,因为您可以将控件紧密地绑在一起,例如,文本框和标签可以放在一起。您可以命名它们txtEmaillblEmail加以区别。以我的经验,这很普遍并且实际上很有用。

但是在您的代码隐藏中,这种命名是不必要的。如果您有一个string用于存储电子邮件的类型变量,只需将其命名email。如果由于某种原因感到困惑,则大多数IDE应该允许您将鼠标悬停在它上面并查看其类型。(理想情况下,在面向对象的东西中,它可能是某个对象的属性,并且user.Email更加清楚。)

我认为,如果您在代码中声明了多个对象,而该对象不是可以正确命名的GUI控件,email则设计中固有存在问题。


1
实际上,txt和lbl并不是匈牙利语,txt只是Text的缩写,而lbl则是Label的缩写,没有理由不只在表单上使用完整的单词,例如EmailText和EmailLabel。匈牙利语就是这种类型,在这两种情况下都是字符串。
史蒂夫

1
@Steve Haigh-不,我是在谈论控件本身。您有一个名为txtEmail的“文本框”类型的对象和一个名为lblEmail的“标签”类型的对象。它们都不是字符串。它们可能具有字符串属性,但它们本身不是字符串。
Andrew Arnold

1
啊对不起 当然是。即使这样,也没有理由不使用更具描述性的名称,例如EmailTextBox。仅仅因为VS产生了一个较差的名字并不意味着您必须保留它。但是,在表格的上下文中,txt和lbl缩写非常好理解,在这种情况下,我可能不会担心。
史蒂夫

3

是什么使变量“长期”?

相反的txtEmailbtnEmail你可以使用UserEmailTextUserEmailButtonAdminEmailTextAdminEmailButton

问题是您可能开始感到变量开始变长:

AdminEmailIsValid 我开始对变量允许的时间进行区分。

此外,您可能会开始注意到正在重用一组变量以及对这些变量的一组操作。这就是OOP的目的。创建一组通用对象,而不是一组变量:

class EmailForm
  var textBox, button, text
  function storeEmail()

然后,您可以将一个新变量实例化为一个类,并使用相同的点符号来访问数据:

userEmailForm = new EmailForm(...data...)
adminEmailForm = new EmailForm(...different data...)
doSomething( userEmailForm.text )
doSomethingElse( adminEmailForm.text )

当然,这是针对使用OOP范例的语言的,但是大多数流行的Web开发语言都是面向对象的,或者允许使用面向对象的代码(PHP,Python,C#,C ++,Java,JavaScript,ActionScript等) )。


我看不到UserEmailText到txtEmail的优势-您只是在给类型加后缀而不是给它加上前缀。我喜欢“这就是OOP的目的”。
fearoffours 2011年

@fearoffours,OP承认具有唯一的名称的问题,我添加了例如作为两个类似变量(之间进行区分的描述性方式UserEmailTextAdminEmailText特异性)。我通常在类型后缀,因为它适合于转到类UserEmailText-> UserEmail.text->,User.email.text具体取决于需要多少抽象/功能。
zzzzBov 2011年

好,看看你从哪里来。+1用于后缀/类的比较。哦,我是OP!
fearoffours 2011年

@fearoffours,哈哈哎呦...
zzzzBov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.