2008/06/13

ハンガリアン記法って二種類なのか

僕も知らなかったのだが、かの悪名高きハンガリアン記法には二種類あるらしい。
一つはシステムハンガリアン、もう一つはアプリケーションハンガリアンというそうである。

システムハンガリアンが、おそらく全ての非MSプログラマの侮蔑を受けている記法である。なにせ型情報を変数名にくっつけてしまおうという、アホそのものの記法だからだ。
もちろん可読性が低いだけではない。コードを書いた・読んだ人間が私は変数の型すら覚えることが出来ない間抜けであると宣言しているようなものだ。他の人間が書いたものでも同じである。ツールで保証でもしない限りこんなルールを守れるはずはない。

これに対し、アプリケーションハンガリアン記法というのは、変数の論理的な側面からその情報を変数に付加しようという考え方である。これは要するにかつてのFortranがi,jなどの変数が必ず整数型を示していたような話をルール化しようというわけである。これが元々のハンガリアン記法だそうだ。

こういう話なら私は全く賛成だ。少し話しは違うようだが、かつてオブジェクト指向の黎明期、その思想などがどこから来たのだろうか?そしてそれ以前のプログラマはどうしていたのだろうか?実は、ごく自然にこれに近いことを行っていたのである。それをルール化し、言語機能に盛り込んでいったものがオブジェクト指向言語の始まりだ。

アプリケーションハンガリアン記法であるが、これにも100%賛成出来るものでもないのだが、実はすでに経験を積んだプログラマは近いことをやっているのである。

わかりやすそうな例でいえばi, j, kなどという変数だ。i,j,kは普通の神経のプログラマなら間違ってもこれをグローバル名にしたり、複雑なクラスや構造体のポインタを入れたりはしない。

間違ったコードは間違って見えるようにする - The Joel on Software Translation Project

上の文章は共感を覚えるところはないではない。目的とするところ、手段は間違っていない。しかしその前提が少し間違っているのである。つまりC++で変数iが何を意味するかわからない。そんな言語機能を使ってしまうことに問題がある。という以前に変数iはローカルの整数型であるように使うことこそが必要なことだ。もちろんこの記事を書いた人はもっと複雑な話のことを話しているのだろうが。