I've seen arguments for and against Systems Hungarian. For some years I've been working on a legacy project that uses this system by naming every variable, function with a prefix of the variable type eg (strName, intAge, btnSubmit etc) (I know the original Hungarian Apps prefixes by the kind of variable, not the type). I'd like my next project to abandon it fully, but I do find it harder to name similar things uniquely without resorting to it.
Lets say I have an webform for collecting email addresses and storing them in a database table, and button which calls the function which save the address to the db.
If I'm using Hungarian style notation, I might call the box txtEmail the button btnEmail and the value contained in the textbox strEmail. I might then use a function storeEmail(strEmail) to store the email. I have a clear convention here, it's obvious what each variable is.
What would be the best practice for naming these variables
- without resorting to Hungarian Systems,
- without making them over long or confusing
- and with a clear convention to use across the whole of my project?
-
2Perhaps there's something wrong with the rest of your naming conventions, or the size of your functions, if you have trouble finding unique names.user7043– user70432011年04月04日 16:42:29 +00:00Commented Apr 4, 2011 at 16:42
-
What technology are you using? These prefixes seem to lend themselves to Web Forms.StuperUser– StuperUser2011年04月04日 16:43:05 +00:00Commented Apr 4, 2011 at 16:43
-
I'm using ASP.NET (with C# behind)fearoffours– fearoffours2011年04月04日 16:44:14 +00:00Commented Apr 4, 2011 at 16:44
-
@delnan - can you elaborate please? Why does function size make naming uniquely easier?fearoffours– fearoffours2011年04月04日 16:45:20 +00:00Commented Apr 4, 2011 at 16:45
-
@fearofours: A smaller function needs less variables, and less variables obviously mean less variable clashes. That assumes of course you put every variable in the smallest possible scope.user7043– user70432011年04月04日 16:46:37 +00:00Commented Apr 4, 2011 at 16:46
3 Answers 3
Your last point is the most important - whatever you do you need to be consistent across your project and with your colleagues. There are two main ways to acheive consistency and if possible you should use both. Firstly use a tool to check naming conventions at build time. In the .Net world StyleCop would be a good example of such a tool. The second way to get consistency is to have peer reviews of all code, so that you can all keep a look out.
Your other two points seem to be asking about an alternative. I'm not sure you need an alternative; the point about Hungarian no longer being popular is that it used to be used to descibe the type when the type system and tools were a bit, shall we say, less strict. I.e. if you were programing in C and passing pointers around the only way to keep track of the type was by using Hungarian. Now, if you are using a language like C# or Java you will not be using pointers (or very rarely), so the need for any kind of Hungarian goes away. Also, modern IDEs let you see the type very easily by hovering over the variable or at worst using some short cut to see the original declaration. So, I don't think you need any kind of notation, just name the variable by what it does. If it's an email address just use "email" or "emailAddress". If it's a customer name just use "customerName" etc.
-
2It gets a little trickier when the form/page/window/whatever has a button for email, a text box for email, and maybe another widget/control for email...FrustratedWithFormsDesigner– FrustratedWithFormsDesigner2011年04月04日 17:23:51 +00:00Commented Apr 4, 2011 at 17:23
-
7@FrustratedWithFormsDesigner Not necessarily. The text box could be emailAddressInput where as the button be emailAddressSubmit and the internal representation be simply emailAddress.Jonathan– Jonathan2011年04月04日 18:41:07 +00:00Commented Apr 4, 2011 at 18:41
-
@Jonathan: Good point.FrustratedWithFormsDesigner– FrustratedWithFormsDesigner2011年04月04日 19:14:22 +00:00Commented Apr 4, 2011 at 19:14
When dealing with web forms / Windows forms / other graphical stuff, it makes sense to use Systems Hungarian since you can have controls that are very tightly tied together—for instance, a text box and a label that go together; you might name them txtEmail and lblEmail to distinguish them. In my experience, this is common and is actually useful.
But in your code-behind, this kind of naming is unnecessary. If you have a variable of type string that is being used to store an email, just name it email. If, for some reason, you get confused, most IDEs should allow you to hover over it and see its type. (Ideally, in OO stuff, it might be an attribute of some object, and user.Email is even more clear.)
I think if you have more than one object being declared in your code that isn't a GUI control that could be rightfully named email, something is inherently wrong with your design.
-
1Actualy txt and lbl are not Hungarian, txt is just short fo Text and lbl short for Label, there is no reason not to just use the full length word e.g. EmailText and EmailLabel on a form. Hungarian would be the type, which in both of these cases is a string.Steve– Steve2011年04月04日 16:52:39 +00:00Commented Apr 4, 2011 at 16:52
-
1@Steve Haigh - No, I'm talking about the controls themselves. You have an object of type "textbox" called txtEmail, and an object of type "label" called lblEmail. Neither of them are strings. They may have string properties, but they are not strings themselves.Andrew– Andrew2011年04月04日 16:57:54 +00:00Commented Apr 4, 2011 at 16:57
-
1Ah, sorry. Yes of course. Even so, there is no reason not to use a more descriptive name such as EmailTextBox. Just because VS generates a poor name doesn't mean you have to keep it. However, in the context of forms, the txt and lbl abbreviations are so well understood I would probably not worry in that case.Steve– Steve2011年04月04日 17:02:06 +00:00Commented Apr 4, 2011 at 17:02
What makes a variable "over long"?
Instead of txtEmail, btnEmail you could use UserEmailText, UserEmailButton, and AdminEmailText, AdminEmailButton
The issue with this is you might start feeling that the variable starts to get long:
AdminEmailIsValid starts to borderline on how long I'd allow the variable to be.
Additionally, you might start noticing that you're reusing a set of variables, and a set of operations on those variables. This is what OOP is designed for. Instead of a set of variables, create a generic object:
class EmailForm
var textBox, button, text
function storeEmail()
Then you can instantiate a new variable as a class, and use the same dot notation to access your data:
userEmailForm = new EmailForm(...data...)
adminEmailForm = new EmailForm(...different data...)
doSomething( userEmailForm.text )
doSomethingElse( adminEmailForm.text )
Of course, this is targeted towards languages which use the OOP paradigm, but the majority of popular web development languages are object-oriented, or allow for object-oriented code (PHP, Python, C#, C++, Java, JavaScript, ActionScript, etc).
-
1I fail to see the advantage of UserEmailText to txtEmail - you're just suffixing the type rather than prefixing it. I like "This is what OOP is designed for", though.fearoffours– fearoffours2011年04月04日 22:05:34 +00:00Commented Apr 4, 2011 at 22:05
-
@fearoffours, OP admitted to having an issue with unique names, I added that example as a descriptive way of distinguishing between two similar variables (
UserEmailTextandAdminEmailTextspecifically). I usually suffix types as it lends itself to moving to a classUserEmailText->UserEmail.text->User.email.textdepending on how much abstraction/functionality is necessary.zzzzBov– zzzzBov2011年04月04日 22:13:47 +00:00Commented Apr 4, 2011 at 22:13 -
OK see where you're coming from there. +1 for the comparison of suffix/ class. Oh, and I am the OP!fearoffours– fearoffours2011年04月05日 13:34:14 +00:00Commented Apr 5, 2011 at 13:34
-
@fearoffours, lol whoops...zzzzBov– zzzzBov2011年04月05日 15:10:46 +00:00Commented Apr 5, 2011 at 15:10