ハンガリアン記法は悪なのか?
最近、D言語の解説書が出ていたので買ってくる。個人的にはD言語には懐疑的ではある。「カレーライス(C++)とハンバーグ・ステーキ(JAVA)とナポリタン・スパゲッティ(C#)を混ぜたら、とても美味しい。」的な発想に思えてならないからだ。確かに、それなりに美味いかもしれないが、合わせるために、デミグラス・ソースは省いて、ケチャップは使わないで…、となっては、結局、単品よりは美味しくならない気がするのだ。だからといって、全部を混ぜるのは味のバランスが崩れて、非常に不味いものになる可能性もある。(ひょっとしたら、飛び切り美味くなる可能性も、あるにはあるが)
まぁ、開発途上の言語なので、それはそれで見守っていけばよいのだろうが、パラパラと本を捲っていると、「ハンガリアン記法は使わない」と書いてあった。この記述だけがあり、使ってはいけない理由が記述されていなかった。で、インターネットで調べてみたのだが、D言語を紹介しているページを見ると、「絶対、使っちゃダメ」と記載されていた。これまた、理由が記載されていない。
ハンガリアン記法とは、MicrosoftのCharles Simonyi氏発案の記法で、変数名の前に、型を示す前置文字(プレフィックス)を置くやり方の事を指す。もちろん、メリットもデメリットもある方法ではあるが、インターネットのサイトのいくつかは、感情的に否定している様に見受けられる(「悪名高きハンガリアン記法」、「ソースにハンガリアン記法使っているから、お里が知れる」等)。これは、「Microsoft=悪、Windows=悪。ゆえにMicrosoftが発明しWindowsプログラミングで使われているハンガリアン記法も当然悪だ。」と言っているように思えてならない。
私も、Microsoftは好きではないし(どちらかと言えば、仕事を増やすので嫌い)、可能なら(これまた、いらん仕事を増やすので)Windowsとかかわりたくない人だが、だからといって、全否定するのは、どうかとも思う。もちろん、全てにハンガリアン記法を強制しようとは思わないし、ハンガリアン記法が適さない場合も多くある。だが、頭からハンガリアン記法を否定するのは教条的過ぎるような気がする。
ハンガリアン記法の便利な点は、宣言を見なくても型が特定出来る点であろう。これは、これで慣れると便利なものだ。
「暗号めいた名前」という記述も見受けられた。私が、よく使う前置文字は、
| n | サイズを気にしない符号付き整数型(int) |
| u | サイズを気にしない符号なし整数型(unsigned int)、または符号なし整数を示す |
| c | char型 |
| sh | short型 |
| l | long型 |
| f | float型 |
| d | double型 |
| p | ポインタ |
| a | 配列 |
| sz | 文字列 |
| by | BYTE型 |
| b | bool型 |
| fn | 関数型 |
| m_ | 構造体、クラスのメンバ変数 |
| C | クラス名 |
| S | 構造体名 |
| E | 列挙名 |
あたりだが。「暗号」と言われるのは、これらが組み合わされた場合を言っているのだろう。
int anArray[ 10 ] ;
char * pszFileName ;
char * apszArgv[] ;
確かにapとpaでは表す意味が違うので混乱する場合もあるだろう。ただ、複雑な宣言に対しては複雑な前置が付く。つまり、元々の宣言が複雑な場合が多いように思う。
欠点は、利点の逆だと言る。例えば、実際の型と違う名前を付けると大混乱となる。例えば、
int szFileName ;
等と書いていれば、確実に変数の型を誤認するだろう。しかし、ちゃんと統一して書かなければ、どんな記法でも混乱するのは当り前ではないだろうか?
char pszName ;
char szName[ 10 ] ;
...
pszName = szName ;
これも、よくやる間違い。(ハンガリアン記法でpを付けたので安心して、実際に*を付けていない)
また、その変数の型が変わった場合、プログラム中の全変数名をリネームしなければならないのも欠点だと言える。(ただ、型依存のコードを書いている場合には、逆にチェック対象にしやすいとは言えるのだが)
もう一つの欠点は、基本データ型以外には適用し難い事があげられる。C++の場合、クラスのインスタンスにはハンガリアンが適用し難い。私の場合、ハンガリアン記法は絶対だと思っていないので、Pascal記法(最初の文字が大文字)で記述している。だが、これでは、ハンガリアンの恩恵は受けられない。
CHogeHogeClass HogeInstance ;
私個人の意見としては、長所と欠点を知った上で、使い易いものを使えばよいのではなかと思っている。盲信的に、ある書き方に拘るのは馬鹿げている。同様に、誰が考えたかとか、何処で使っているからという理由から不当に扱ったり、自身の記法と違うから排斥したりするのも馬鹿げている。要は、最も生産性が上がる方法を採れればよいのだ。
Microsoftは、長くハンガリアン記法を採用してきた。が、.NETでは使わない事になった。これを見て、「ほら、Microsoftも使わなくなった」という意見もある。「Microsoftしか使っていなかったんだから、そこが使わないなら使わんでもいいだろう」という事だと思うが、一つ間違えば、「Microsoftが使えば標準で、使わなければ非標準」という話になりかねない気がする。メリットが無くなったから(またはデメリットが大きいから)使わないのだという論点が必要なのではないだろうか。
D言語では、Camel記法とPascal記法を使うという事に異論はない。それには、そうするだけの訳があったろうから。ただ、その訳を知りたいと思うのは、私だけだろうか。
| 固定リンク


コメント
ハンガリー記法については同感ですね(^^
現場の知恵風で使い勝手いいものですよね。
私自身は、ハンガリー記法を否定する考え方は、英語ネィティブな人だと、理屈上は一理あるかもしれないともしれないと思いますが、日本人なら否定する理由はないと思いますね。D言語については、そんなのが最近あるらしいくらいしか知りませぬ(^^;
投稿: こーどや | 2005/02/22 21:16
そうですね、私も変数名は長く書く方ですが、正確な英語表現かどうかは、はっきり言って自信が無いです(笑)。それに、コメントを日本語で書いてしまうと、どのみち英語ネイティブには「暗号」だらけになってしまいます。海外からメールで「コンパイル出来ねー!」と、お叱りを受けたりもしますし。
D言語は、C++やJAVAの人気のある機能を混ぜた感じの言語です。だから、「C++でガーベージ・コレクタを使いたい」とかいう御仁には便利かもしれませんが、イマイチ、何がしたいのか判らん言語です。
投稿: Lynx | 2005/02/23 11:06
この記事は2年近く前の記事ですので、もうご存知かもしれませんがこういうものもあります。
http://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
このページに則って言うと、私は「アプリケーションハンガリアン」に関しては賛成です。
投稿: 通りすがり | 2006/12/27 12:50
通りすがりさん、ご意見ありがとうございます。お知らせ頂いた記事を面白く読ませていただきました。
本人多忙と、メインを、他のブログに移行した為、このブログはうち捨てられた状態になっておりましたので、まさかコメントがあろうとは思っておりませんでした(苦笑)
関連記事をトラックバックいたします。
投稿: lynx | 2006/12/29 00:44