「間違ったコードは間違って見えるようにする - The Joel on Software Translation Project」というページの後半にハンガリアン記法の説明がある。
シモニイのハンガリアン記法のオリジナルのアイデアは、Microsoft内部ではアプリケーションハンガリアンと呼ばれ、それはアプリケーション部門で、すなわちWordとExcelで使われていたためだ。Excelのソースコードにはrwとcolというのがたくさん出てくるが、これは行(row)とカラム(column)を表している。どちらも整数だが、これらの一方を他方に代入するのは意味がない。
Cのような言語ではこれには意味があるだろう(後述)。しかし、間抜けた人たちは「システムハンガリアン」というものを考え出した。
システムハンガリアンはlongを意味する"l"、unsigned longを意味する"ul"、double word(これは、実際は、その、unsigned longと同じものだ)を意味する"dw"のような、あまり役に立たないプレフィックスを使う。
ちょっと考えれば(考えなくても)わかるが、CやC++、C#、Javaといった「変数に型のある言語」ではこんな物は全く意味がない。
ではさてアプリケーションハンガリアンは、意味があるだろうか。
Cにおいては、行数を表す型、列数を表す型をtypedefしても元の型がintである限り代入も演算も可能だ。一方、C++、C#、Javaといった「変数に型のある」オブジェクト指向言語で、行数を表すクラス、列数を表すクラスを宣言すれば、行と列のの変数は代入や演算はできない。従って、システムハンガリアンが無意味なのと同じくらい、あるいはそれ以上に、これらの言語ではアプリケーションハンガリアンも意味がない。
さて、Ruby等の「変数に型の無い」言語ではどうだろうか。確かに意味があるが、変数に代入可能なクラスを限定することはRubyの良さを殺してします。ただ、アプリケーションハンガリアンはよく考えて使えば意味がありそうだ。