オルタナティブ・ブログ > 一般システムエンジニアの刻苦勉励 >

身の周りのおもしろおかしい事を探す日々。ITを中心に。

システムハンガリアン記法は時代遅れ?

»

昨日のエントリでintPrintCountのような「型に関する接頭辞」をつけるとわかりやすいと書きました。

一行で一目置かれるプログラム
http://blogs.itmedia.co.jp/yohei/2008/04/post-52d8.html

これは、そういう文化の下で育った一部の人にはわかりやすい、というのが正解のようです。

wikipediaにこんな記述がありました。

本来、シモニーの考案したハンガリアン記法とは、変数の意味や使用目的から接頭辞を決定することであり、型では区別できない情報を変数名に付与することで、紛らわしい変数の意味を明白にし混同をさけるためのものであった。たとえば、論理座標とデバイス座標、X軸とY軸、ドルと円などで、これらは単純に型による安全性に頼ることはできない。

ハンガリアン記法 - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95

この続きに書いてあったことによると、型を意識して変数を命名する記法をシステムハンガリアン、本来の意図の通り変数の意味や使用目的を意識して変数を命名する記法をアプリケーションハンガリアンというそうです。

昨日の例でいうintPrintCountはintの部分に着目すればシステムハンガリアンの代表的な例と言えるでしょう。Printのところを見るとアプリケーションハンガリアン的でもあります。自分が普段書くコードを思い返してみると、システムハンガリアン記法に沿ってintやらstrやらをつけただけでなく、アプリケーションハンガリアン記法に沿った命名(intPrintCount)をしている事を確認してほっとしました。ついでに、私的にJavaで書いたコードを探して見てみたところ型の接頭辞を使っていませんでした。言語が持つ雰囲気に影響されているのかもしれません。

さて、この2つの記法ですがアプリケーションハンガリアンであれば、システムハンガリアンになっていても良いか?というとそういうわけではないようです。

システムハンガリアンへの反論(wikipediaのハンガリアン記法より抜粋)

  • システムハンガリアンを使っているソースコードを修正してデータ型を変更した際、変数名を変えるのを忘れて、データ型と変数名が対応しなくなることがある。
  • システムハンガリアンに慣れているプログラマ以外にとっては可読性の低い記法である。
  • Microsoft自身が、(.NET Frameworkで)システムハンガリアンを廃止している。

1番目は身に覚えがありますね。上流から流れてくるデータの仕様が変わってInteger型の変数をLong型の変数に変えるというときには結局すべての場所で使用されている変数名を置換しなくてはなりませんでした。(おかげでその変数が絡むすべての処理を目視で確認することができましたが。)型を接頭辞にしていなければ宣言だけ変更して影響範囲を調査すれば良いわけで、効率を落としてしまいますね。

2番目は、自分にとってはわかりやすいですが、そう思わない人がきっとたくさんいるのだと思います。そう言われると以前一緒に仕事をしたJava出身の人から「読みづらい」と不評でした。

3番目は、そういえばそんなようなことを研修で習ったような……という気がしたのでソースを探してみました。

「.NET Framework 開発者ガイド」より

ハンガリー表記法は使用しないでください。
ハンガリー表記法では、識別子のデータ型など、パラメータに関するメタデータをエンコードするために、識別子にプレフィックスを含めます。

.NET Framework 開発者ガイド 名前に関するガイドライン
http://msdn2.microsoft.com/ja-jp/library/ms229002(VS.80).aspx

やはり明確にやめるよう記述されていました。きっと現在でもintPrintCountのような変数を規約化しているところは、既にその方式で書かれたコードがわんさかある事でしょう。そうなっているとシステムハンガリアン記法を変えることは容易な事ではなくなってしまいますが、それでも世の中の流れを意識しておく必要はあるかと思います。(VisualBasic界では今後も生き続けるような気もしますが。)

他にも、@itのアンケートで型のプレフィックスをつける派は劣勢になっていました。Insider.NETでのアンケートなので.NET界でも反対派が多いことがわかります。確かにdataTableなりsqlConnectionなりのすべてのオブジェクトにプレフィクスを考えていたら日が暮れそうです。

賛成 18 16.22%
反対 73 65.77%
機能限定なら賛成 16 14.41%
その他 4


変数名に変数の型のプレフィックスを付けることに関しての質問および投票です - Insider.NET
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43470&forum=7

他にもITproにこんな記事がありました。

ハンガリー記法の利用者が減りつつあるのはなぜだろうか。一つには,以前ほど必要ではなくなったことが挙げられる。Windows 3.0以前のSDK(Software Development Kit)では各種のハンドルがすべて同じ型であったうえにポインタとしてそのままアクセスできたため,混同しないようにプレフィックスを付加することに大きな意味があったのだ。だが今ではハンドルは種類ごとに違う型として定義されているし,C++で開発するならそもそもハンドルを直接扱うこと自体,めったにない。結果,変数の型を変更するたびに名前まで変えないといけない,といったハンガリー記法のデメリットのほうが気になるようになったというわけである。

昔の“常識”,今の“非常識”:ITpro
http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20031002/1/

やはりintやらstrやらの接頭辞は必要ないといえば必要ないように感じますね。VisualStudio等のIDEを使用して開発を行っているのであれば変数にマウスを乗せるだけで型が表示されますのでぱっと見て型を知ることもできます。何もわざわざ変数名に型を含めておく必要など無いでしょう。

最後に、昨日のエントリでの私の発言を自己引用しておきたいと思います。

このあたりは所属先のコーディング規約を最優先とすべきところだと思いますので、「俺はこうしたいんだ」という信念はほどほどにしておくと良いと思います。

はい。ほどほどにしておきます……。

Comment(3)

コメント

MSがハンガリアンをやめるようドキュメントに書くとは驚きですね。時の流れでしょうか。。

森崎さん、コメントお待ちしておりました(笑)
私もおどろきました。このドキュメントは.NET framework 2.0のものですが、.NET framework 1.1の時に既に研修でそのような話を聞いたような記憶があります。
VB5,6と比較してVB/C#の型指定が強くなった証拠なのではないでしょうか。(それでもJavaほど強くはないと言われますが)

名無し

最近JavaScriptに型付配列が導入されましたが
これはint8A~みたいにしないと紛らわしいです

型が薄い言語で型を強く意識する時は必要なのではないかと思います

コメントを投稿する