泣くな! ハンガリアン記法さん あなたは悪く無い

今更ハンガリアン記法について書いてみよう。
変数名の命名法って色々あります。
よく聞くのはこの辺かな。
 ・ハンガリアン
 ・キャメル
 ・スネーク
個人的にはハンガリアン記法は好きです。(最近はあまり使いませんが)
キャメル記法もスネーク記法もよく使います。
まぁ、仕事の時はコーディング規約があるので個人的な拘りは無いですけど。
で、ハンガリアン記法について思うことを書いてみたい。
ハンガリアン記法を嫌う人は多いし、最近ではほぼ使われていないんじゃないかな。
私も使う事はかなり少ないです。
ハンガリアン記法って悪く言われることが多くて・・・・
でもそれはなんか違うなぁ・・・と思ってます。
ハンガリアン記法は変数の型を先頭に付けるってよく言われます。
 ・int型 なら intHoge
 ・文字列型 なら strHoge
みたいな感じ。
これはこれで便利だと思うし、通常はハンガリアン記法を使うなら上記のように書く事が多いでしょう。
で、ハンガリアン記法の批判で一番よく言われるのが、コレ↓

 「変数の型が変わったら、その変数を使っている箇所を全部置き換えないといけないじゃん!」

確かにそうだけど、変数の型ってそんなに変更するのかな?
もちろんこういう事態が発生する事はあるけど、エディタで置換なり検索なりすればすぐ分かるじゃん。
変数名を変えるのが大変とはとても思えない。
※もちろん、ソースコードに手を入れるということは、不具合の発生率がそれだけ上がるので変数名だけとは言え変更しない方がいいのは確かです。「仕様がどんな風に変わっても変数名を変える必要は生まれない」ようにしておくのは良い事。
そもそも変数名云々の前に1個の変数の型を変えるってすんげー大変な事。
その変数を使っている箇所を全部洗い出して、影響のある処理や別の変数を探し出さないといけない。
例えば、「intBaka = intHoge;」みたいな代入式があって、intHogeの型をlongにした場合、intBakaにも影響が出るよね。
intBakaもlong型に変更したら、またintBakaの使用箇所を検索しないといけない。
intBakaやintHogeを引数として渡していたらその関数の影響を見ないといけないし、intBakaやintHogeが属している関数をコールしている呼び元の影響もみないといけない。
・・・・って事になるので、変数の型をそう簡単に変えちゃダメ。
※とは言え、様追加や仕様変更で変数の型を変更せざるを得ないことがあるのは確か。
で、この記事では「変数の型を変えるな!」って事を言いたいのではない。
ハンガリアン記法は可哀想な誤解を受けている事を書きたい。
と言っても普通のプログラマならご存知でしょう。
変数型を付与するのはいわゆる「システムハンガリアン」と呼ばれていて、これが一般に広まり誤解の元になっています。
ハンガリアン記法が目指していたものは「システムハンガリアン」だけではなく、「アプリケーションハンガリアン」も目指していました。
アプリケーションハンガリアンとは、「意味のある接頭辞/接尾辞」を付けましょうということです。
意味のある語を付けることで、「間違ったコードが間違って見える」ためなのです。
Wikipediaにもありますが、「dolIncome + yenDeposit」という記述は見れば間違いと分かるはず。
ドルと円を足したらアカンやん!って他人が見ても自分が見ても分かりますよね。
※このコードが正解ならば、コメントで「ドルと円を足すのはわざとやねん」って書いておけば良いだけ
「Income + Deposit」「intIncome + longDeposit」と書いたらそんな間違いには気づきません。
こういう使い方であればハンガリアン記法は有効だと思いますが、「システムハンガリアン」ばかりが広まってしまい「ハンガリアン記法は悪だ!」みたいな風潮になってしまったのはハンガリアン記法がカワイソウだなぁと感じます。
とは言え、「アプリケーションハンガリアン」の代わりになるようなものは変数名の中に入れ込むことが多いでしょう。おそらくですが「intDolIncome」とか「intYenDeposit」みたいな命名にする人が多いのでは?
・・・って考えると、ハンガリアン記法って特別意識しなくてもいいでしょう。
誰が読んでも分かるようにするという意味で「アプリケーションハンガリアン」の考え方だけは頭に入れておいて、変数に名前を付ける時の参考にすればいいんじゃないでしょうか。
ただ・・・・・・
C言語のソースを読むと、ポインタ変数に「p」を付けることは多いけど、関数の引数にもパラメータという意味で「p」をつける事が多い。そこは明確に分けて欲しいなぁと思う時はある。
あと、文字列を収める配列で終端文字が入るものはいいんだけど、終端文字を絶対に入れない変数がたまにある。受け取った側で終端文字を付与する必要があるんだけど、変数名を見ただけだと分からないから、そういったものの変数名は明確に分けないといけないね。(終端文字ありなら「sz」、無しなら「s」とか)
 

1 個のコメント

  • 型だけ変えて変数名を変え忘れ、チグハグなコードにならないように使わないってことです。(無駄なコメントを書かないのと一緒ですね)
    注意すべきは型変換ですが、致命的な変換ミスはc++以降の構文を使っていればコンパイラが弾いてくれます。また、ハンガリアン表記のおかげで型変換のミスに気がつけたなんてことは、ほとんど経験がありません。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    ABOUTこの記事をかいた人

    Windows/Mac/Linuxを使う現役システムエンジニア&プログラマ。オープン系・組み込み系・制御系・Webシステム系と幅広い案件に携わる。C言語やC#やJava等数多くのコンパイラ言語を経験したが、少し飽きてきたので、最近はRubyやPython、WordPressなどのWeb系を修得中。初心者向けのプログラミング教室も運営中。オンライン・対面・出張等でプログラミングをレッスンします。