Fabulous Adventures In Coding

Eric Lippert's Blog

Bad Hungarian

One more word about Hungarian Notation and then I'll let it drop, honest.  (Maybe.)
 
If you're going to uglify your code with Hungarian Notation, please, at least do it right.  The whole point is to make the code easier to read and reason about, and that means ensuring that the invariants expressed by the Hungarian prefixes and suffixes are actually invariant.
 
Here's some code I found once in the "diagram save" code of a Visio-like tool:
 
long lCountOfConnectors = srpConnectors->Count();
while( --lCountOfConnectors)
{
      // [Omitted: get the next connector]
      // [Omitted: save the connector to a stream]
}
 
OK, first of all, that should be cConnectors.  But that's just a trivial question of what lexical convention we use.  There's a far more serious problem here. The number of connectors is not decreasing as we iterate the loop, so cConnectors should not be decreasing
 
Hungarian makes it easier to reason about code, but only when you make sure that the algorithm semantics and the Hungarian semantics match.  Seriously, when I first read this code I naturally assumed that it was removing connectors from the collection for some reason, and therefore decreasing the count so that the count would continue to match reality.  But in fact it was just using the count as an index, which is wrong.  The code should read something like:
 
long cConnectors = srpConnectors->Count();
for(long iConnector = 0 ; iConnector < cConnectors ; ++iConnector)
{
      // [...]
}
 
In other words, the name of a variable should reflect its meaning throughout its lifetime, not merely its initialization.

Published Tuesday, September 16, 2003 4:37 PM by Eric Lippert
Filed under:

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

Fabulous Adventures In Coding said:

2003/09/12 What's Up With Hungarian Notation? 2003/09/12 Eric's Complete Guide To BSTR Semantics 2003/09/12...
June 10, 2005 4:55 PM

Leave a Comment

(required) 
(optional)
(required) 
Submit

About Eric Lippert

Eric Lippert is a senior developer on the Microsoft C# compiler team. Before that he worked on the framework of Visual Studio Tools For Office. Before that, he worked on the compilers, runtimes and tools for VBScript, JScript, Windows Script Host and other Microsoft Scripting technologies. He lives in Seattle and spends his free time editing books about programming languages, playing the piano, and trying to keep his tiny sailboat upright in Puget Sound.

This Blog

Syndication


© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker