ハンガリアン記法

間違ったコードは間違って見えるようにする - 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の良さを殺してします。ただ、アプリケーションハンガリアンはよく考えて使えば意味がありそうだ。