ハンガリアン記法 | 悪態のプログラマ

悪態のプログラマ

とある職業プログラマの悪態を綴る。
入門書が書かないプログラミングのための知識、会社の研修が教えないシステム開発業界の裏話は、新人プログラマや、これからプログラマを目指す人たちへのメッセージでもある。

変数などの名前を付ける時のコーディングルールに、ハンガリアン記法(ハンガリー記法)と呼ばれるものがある。簡単に言えば、名前の先頭に「型」などを表す文字列(プリフィックス)をつけるというものである。


かつて Microsoft が好んで採用しており、 Visual C/C++ (MFC) を使ったWindows プログラミングの仕事が多かった私の会社では、社内ルールとしても採用されている。



というわけで、私も、ハンガリアン記法で多くのコードを書いてきたのだが、あるとき、Joel Spolsky 氏の「間違ったコードは間違って見えるようにする 」という記事を読んでショックを受けた。


それまで私が書いてきたハンガリアン記法というのは、MFC でやっているように、変数名に「型(type)」を表すプリフィックスを付けるものだった。しかし、それは「システムハンガリアン」と呼ばれ、本来のハンガリアン記法ではなかったのだ。


本来のハンガリアン記法とは、「アプリケーションハンガリアン」と呼ばれ、プログラミング言語の「型」とは無関係に、データの「種類(kind)」を変数名で表現する方法であった(※1)。


アプリケーションハンガリアンを使えば、変数間の互換性(端的に言えば、代入してもよいかどうかということ)が、コードの読者(コードを利用する人、改造する人、デバッグする人、レビューする人、そして、そのコードを書いた人自身)に明確に伝わる。ここでいう互換性とは、文法的なものではなく、意味的なものである。文法的な互換性はコンパイラがチェックしてくれるが、意味的な互換性は人間がチェックするしかない。


つまり、本当に有用なのは、文法的な「型」を明示するシステムハンガリアンではなく、意味的な「種類」を明示するアプリケーションハンガリアンなのである。



今では、Wikipedia にも「アプリケーションハンガリアン」と「システムハンガリアン」の違いが記述されている(※2)。しかし、古参のプログラマは、あらためてハンガリアン記法の意味など調べない人がほとんどだろう。一方で、Microsoft からシステムハンガリアンが消えようとしている時代にあって、新参のプログラマが、ハンガリアン記法について考える機会はどんどん少なくなるだろう。


しかし、そんな時だからこそ、アプリケーションハンガリアンの価値を再考すべきではないだろうか。特に、自前のコーディング規約の作成を考えている人には、是非とも先に紹介した記事は読んでもらいたい。プリフィックス方式を採用するかどうかは別にしても、少なくとも、意味的な種類(kind)を明確にする、という考え方は取り入れるべきだろう(※3)。







※1
もちろん、アプリケーションハンガリアンを使わない場合でも、変数名はデータの意味的な「種類(kind)」を表すようにすべきだ。しかし、それをプログラマ個人に任せてしまうと、不統一になってしまって意味がない。ルール化するということが大切なのだ。


※2
2007/4/22 現在。Wikipedia の項目名は「ハンガリー記法 」となっているが、「ハンガリアン記法」への改名が提案されている。


※3
システムハンガリアンのルールを作るのが簡単だが、アプリケーションハンガリアンのルールを作るのは難しい。しかし、Joel Spolsky 氏の記事にある「本当の解決法」はそのまま使えるし、他のルールを作る上での参考にもなる。また、類似したデータを取り違えてバグになった経験を思い出せば、いくつか思いつくのではないだろうか(例えば、「YYYYMMDD」と「YYMMDD」、「ゼロ埋めしているデータ」と「ゼロ埋めしていないデータ」、「枝番つきコード」と「枝番なしコード」、「協定世界時」と「日本標準時」、文字コード違いの文字列・・・)。



■関連記事

チームのために自分のスタイルを曲げる覚悟
慣例的コーディングルール
プログラムに操られた男
その名前、紛らわしい!
読者指向プログラミング




Joel on Software
Joel on Software
posted with amazlet on 07.04.22
Joel Spolsky 青木 靖
オーム社 (2005/12)
売り上げランキング: 1815
おすすめ度の平均: 4.5
5 実際に現場で使わせてもらってます
3 優秀なソフトウェア開発者の日々の徒然
3 プログラミングチームを率いるときに


C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス
Herb Sutter Andrei Alexandrescu 浜田 真理 浜田 光之
ピアソンエデュケーション (2005/10)
売り上げランキング: 37199
おすすめ度の平均: 5.0
5 上級者には心得集、中級者にはポインタとして
5 この二人以上にC++について語れますか?
5 文法だけでは分からない、C++の書き方