ハンガリアン記法 (Hungarian notation)

注意

  • ハンガリアン記法は一時期もてはやされていたが、現在は推奨されておらず、使用すべきではない。
  • むしろ、多くの場合アンチパターン

ハンガリアン記法とは?

  • 変数名やクラス名などの識別子に、規則に則った接頭辞 (prefix) や接尾辞 (suffix) を付けるモノ。
  • それらによって使用方法、型、スコープに関する情報を付け加える。
    • 例えば、文字列なら先頭に s を付けるとか、ポインターなら先頭に p, lp を付けるとか
  • 多くの場合、型情報を接頭辞としてつける。
  • 識別子を利用する側から、型など間違いがあることを視覚的に分かるようにすることを目的としていることが多い。

なぜダメなのか?

ソースコードの修正コストが上がる

  • 識別子に型情報が直接的に入ることになるので、型を修正すると識別子を全ての使用箇所で修正しなくてはならない。
  • 修正が追い付いていないと、実態とハンガリアンにズレが生じてきておかしなコードになる

命名測がしっかりしていれば、そもそも不要であり、むしろ冗長

  • 本来識別子の名前は実態を正確に伝えるものであってほしいため、命名測がしっかりしていれば名前から型がおのずと決まるはずである。
  • ハンガリアンがないと型が分からない場合は、命名方法がすでにおかしい可能性がある。

そもそもハンガリアンを正確に覚えなければならない

  • ここここ の一覧をパッと覚えられるならいいが・・・(私は無理でした)
  • ハンガリアンは性質上、プリミティブ型の体系の異なる言語では変えないといけないので、言語の数だけ覚えなければならなくなる可能性がある。(JavaScript の Number みたいなのは面倒くさそうだ)

ただ・・・

  • 場合によっては必要な場合もある。
    • MFC や Win32 API では、ライブラリ側で利用されているため、故意に外すとそれはそれで一貫性を損なう。
  • ただ、意味もなく(考えもせず)両手放しに利用していいものではない。
    • goto も必要な時もある』のと同じ様に、一定の技術レベルと、動機がないならやめておくべきだと思う。
  • プロジェクト等のコーディング規約で既に決まっている場合はそれに従うべき。
  • 有用なものもある
    • C++private フィールドには m_ を先頭につけるとか。

ハンガリアン記法もどき

  • ハンガリアンをハンガリアンだと認識して使っている場合はまだいいが、そうだと思っていない場合には注意が必要だと思う。

class 名に Class とつける

  • 何かの分類 (class) を取り扱う class でもない限りは使用すべきではない
  • 少なくとも (文法上) class であることを明示したいだけならば付けるべきではない。 (見ればわかる)

関数名に FunctionCommand を付ける

  • 見ればわかる
  • 関数名は『○○をする』と明記されているはずなので、そこに Function とつけるのは冗長。ほとんどの場合で何か処理を行うモノは関数以外にはあまり無いだろう。
  • 関数に Function と付けても得られる情報はなにも増えない。
  • ただし、アーキテクチャーやデザインパターン名の場合は付けることが多い。
    • GoF の Command パターン、WPFCommand など

参考資料