「正しい(抽象的)」ハンガリアン記法とは何か?

この記事でも少し話していた「正しい(抽象的)」ハンガリアン記法とは何か?を記載してみます。


ハンガリアン記法とは?

要約するなら、何かを命名する際にはプレフィックス(頭に)に意味を持たせようという記法です。

現代では正しいハンガリアン記法と言われるもの

URLのエンコード、デコード周りのサンプルで説明致します。

encodedURL = encode(url)
諸々
decodedURL = decode(encodedURL)

URLに対して、エンコード処理を行っていますね。変数名から、中身は一目瞭然です。デコード処理の方も、どういったことをしたいのかは一目瞭然です。

コメントが無くても、コードからやりたいことが分かります。

現代では誤ったハンガリアン記法と言われるもの

型名をプレフィックスに入れたものです。

strLabel = "ラベルに出す文字"

変数名に型名を含むやつです。古代のソースを保守する時は、見かけることがあります。

「正しい(抽象的)」ハンガリアン記法とは

これを考える上では

  • Windows API(16bit)

  • Windows API(32bit)

  • MFC(Microsoft Foundation Class)

  • .net FrameworkのWindows Forms

これらの歴史を追うと、分かり易いです。

WindowsAPI(16bit)

dwSizeようなバイトサイズを意識したハンガリアン記法は一見間違いに見えます。しかし、この頃はアセンブラ ⇒ Pure Cの移行期でもあります。

アセンブラ使いがC言語に移行するために付けた命名と考えるなら、一概に間違いとも言えない命名とも考えられます。

当時の時代背景を考えるなら、参加したプロジェクトメンバのスキルセット次第では正しいハンガリアン記法になりうると思います。

コメントを如何に減らせるか?で言えば、当時を考えるなら貢献していたと考えます。

WindowsAPI(32bit)

better Cから見れば、dwSizeなどは不要でしょう。この頃には、時代が正しさを古くしてしまったと言えます。見る時代でありがたみが変わるレアなケースだなと思います。

MFC(Microsoft Foundation Class)

忘れろ。忘れるんだ。

better CからC++オブジェクト指向への移行を意識していたんだと思いますが、命名にハンガリアン記法としての正しさはほぼ無いと言えます。誤ったハンガリアン記法の典型と言えます。 

CStringは流石にやりすぎだと感じます。
(classで作られた文字列型という命名です)

.net Framework

ハンガリアン記法がフレームワークレベルでほぼほぼ無くなり、時代の変化を感じますね。

後はプロジェクトメンバのスキルセットに合わせてハンガリアン記法を使って下さいという状態になりました。

総括

プロジェクトメンバのスキルセット次第で、N人の生産性を高める正しさなんていくらでも変わります。

あえて一般論では間違っているものを採用するのも、生産性が上がるなら正しいハンガリアン記法なんじゃないかなというのが個人の感想です。