再考ハンガリアン記法

英語の報告しかしないといって、このエントリは無いなと思いつつも、書き込んでみる。
約1週間で分かったのだが、同じmp3を聞いて感想を毎回書くのは作家でない限り無理じゃないかと思った。
ということで、英語の話は、要所要所でしていこうと思う。
今はまだ、mp3を聞きまくる第1段階だということだけ、分かってもらえればそれでいい。


Joel on Software
Joel on Software Translation Projectで、間違ったコードは間違って見えるようにするという非常におもしろエントリを発見した。
本に載っていないものがかなりあるので暇な人にはおすすめ。


このエントリでは、ハンガリアン記法の誤解を解こうとしている。
私も、今の今まで誤解をしていたようで、ハンガリアン記法もいいもんだな。と思っていたりする。


さて、翻訳のエントリを読むのが、一番手っ取り早く、理解が早いとおもうが、
なかなか長いエントリなので、要約してお伝えするとしよう。


まず、ハンガリアン記法とは、変数名の接頭(prefix)に型の情報を盛り込むこと。
と私は習ってきたし、そうだと思っていた。
例を挙げると、

DWORD dwIndex;
int nCount;
long lRow;

などだ。
しかし、これは、ハンガリアン記法当初の考えとは違う。

本当のハンガリアン記法は、
変数の種類を接頭におくこと」のようだ。
どういうことか。


「間違ったコードは間違って見えるようにする」のパクりだがWebのアプリについての例。
Webアプリケーションを作るときにはユーザがフォームで入力した文字列をそのまま返してはいけない
というルールがある。 要するにサニタイズ(タグの無効化)をしていない文字列を画面に出すなっちゅーこと。


で、「1.サニタイズ済みのもの」、「2.サニタイズをしなければならないもの」という2つのような状態を変数の種類と呼ぶことにする。
つまり、

//PHPコードです。
$unSanitaize = "<div id='content'></div>"; //1
$sanitaize = htmlspecialchars($unSanitize); //2

と言う具合。
で、これらの接頭をサニタイズ済みか、そうじゃないかで分ける。

// 一部CakePHPです。
$usContent = "<div id='content'></div>";
$sContent = htmlspecialchars($unSanitize);
$usUser = $this->User->read(null, 1);
$usName = $usUser["User"]["name"];
$sName = htmlspecalchars($usName);

というように。
こうすることで、セーフな変数と、アンセーフな変数がソース上で分かる。
普通は、実行してみないと分からないことが分かるのだ。
これは、Implementation Patternsの主題でもある、「コミュニケーション」のための強力なツールの一つとして、使えるんじゃなかろうか。


どうやら、論文(ハンガリアン記法の論文があったことに驚き。)には、種類をtypeと表現していたようで、これを見た人たちが、型のtypeだと思い込み、このような大きな誤解が生まれたようだ。
Joel氏は、kindを使い種類を表している。


こう考えると、ハンガリアン記法も、捨てたもんじゃないね。


しかし、Joel氏のエントリは読みやすすぎる。ここまでコアなプログラムの話を、そこらの学生に見せても分かるんじゃなかろうかというような切り口と例え話でわかりやすく説明している。
こんなエントリが書ければいいなぁ・・・