変数・関数などの名づけ方の種類(ルール)である、
システムハンガリアン記法とアプリケーションハンガリアン記法の違いを説明します。
同じところ
どちらも変数名(関数名も含むこともある)を名付ける際の、
「どんな変数かをわかりやすくするためのルール」です。
どちらもどんな変数かを表す目印を変数名の先頭につけます。
この接頭詞を、プリフィクスやプレフィックスと呼んだりします。
違うところ
接頭詞の名づけ方が違います。
例えば「りんごの価格」を計算するための変数を作るとしましょう。
この変数名をApplePriceをベースにするとして、その接頭詞を
Dim lngApplePrice As Long
と、変数の型である「Long」の略lngを接頭します。
これにより、この変数が「整数」であることが良く分かるようになりますね。
このデータの型を変数の先頭に付ける命名規則を、
システムハンガリアン記法、または単にハンガリアン記法と呼びます。
次に、同じくりんごの価格を、
Dim yenApplePrice As Long
と、価格の単位である「円」を接頭します。
これにより、この変数が「円」を単位とした金額であることが良く分かるようになります。
このデータの種類や意味を接頭する変数の命名規則を、
アプリケーションハンガリアン記法と呼びます。
使い分け
ひとまず大事な注意点として、(システム)ハンガリアン記法は割と嫌われています。
昔はメリットがあり、古くは主流だったこの記法も、いろいろと開発環境が整ってきた現代では、無用の長物という認識が強い様です。
上記の例では「整数であることが良くわかる」としていましたが、
りんごの値段と言った時点で、たいてい整数ですからね。確かに不要です。
「変数名を分かりやすくつけるのが大事」というのが浸透した現代では、
どうせ型しかわからない接頭詞は、面倒なだけということなのでしょう。
「間違ったコードが間違って見えるように書く」という点で、
lngApplePrice + strAppleVariety
これが誤りだとすぐわかるのがハンガリアンのウリなようなのですが、
Price + Variety
別にこれで十分おかしいとわかりますからね。
対してアプリケーションハンガリアンは、推奨されるほどではありませんが、そこそこ評価はされているようです。
yenApplePrice + dolLemonPrice
としておくと、変数名だけでは気付きにくいバグに気づくことができます。
余談ですが、この記法の考案者であるハンガリー人のシモニーさんは、
この「アプリケーションハンガリアン」を提唱していたようです。
しかし、意図とは裏腹に「システムハンガリアン」の方が有名になり、
挙句「悪」と評価されてしまうことになりました。
自分の意図とは別の使い方をされたうえに、祖国の名を冠した悪名が生まれてしまい、なんだかかわいそうですね(´・ω・`)
いずれにせよ、「すべての変数名に必ずつけること」みたいな厳格な使用は、
コーディングの邪魔になることの方が多いと感じます。
有効そうだ!と感じた時に、「アプリケーション」ハンガリアンを意識して活用するくらいが、ちょうどよい使い方なのではないかなと思います。
ExcelVBAでは
ExcelVBAではどうかというと、実は結構有効だったりします。
ハンガリアンの是非が議論される普通の?プログラミング言語では、
上記のような「文字列:str」や「数値:lng」などの型の変数が多いため、
これらの変数にstrやlngを接頭するのが無駄といわれます。
対して、ExcelVBAは他言語に比べて扱う変数の型がかなり豊富な言語です。
アプリケーションにくっついたプログラミング言語であるため、
WorksheetやRangeなど、割と初期から多数のオブジェクト変数を扱いますからね。
これらのオブジェクト変数にはハンガリアンがなかなか有効で、
例えば「商品マスタ」「売上データ」などのシートがあった時に
Dim ws商品マスタ As Worksheet Dim ws売上データ As Worksheet
とするのは非常に分かりやすい変数名になります。
この「ws」がシステムハンガリアンとアプリケーションハンガリアンどっちなのかは微妙なラインですが、別に線引きする必要もないですからね。
なるべくアプリケーションハンガリアンに近づけるように意味づけしつつ、オブジェクト変数が何のオブジェクトかわかるように名付けるのは、ExcelVBAにおいてはかなり有効です。
データの型以上の意味を持たせたアプリケーションハンガリアンの例としては、
Dim area集計表 As Range Dim cell検索結果 As Range
と、なんでも「rng」を接頭するのではなく、セル範囲・単独セルの接頭詞を分けることで、なんでもOKなRangeオブジェクトさんに何が入っているのかがわかりやすくなります。
また、先ほどのWorksheetでも、規模が大きいマクロを開発する際は、
Dim MTws商品マスタ As Worksheet Dim DTws売上データ As Worksheet Dim OPws実行シート As Worksheet
など、Worksheetの役割ごとに命名分けしてもいいかもしれません。
たくさんの便利なオブジェクトを扱えるのはExcelVBAの強みです。
それら多彩なオブジェクトをハンガリアンで命名するのは、結構理にかなっていると思いますので、使用を検討してみてください。
おまけ:アプリケーションハンガリアン+日本語
↑でも使いましたが、(アプリケーション)ハンガリアンと日本語はとても相性が良いです。
ハンガリアン部分と変数名本体の区切りがどこかが明確なので、ハンガリアンの冗長さがだいぶ軽減されていて見やすいですよね。
見やすさ以上の利点として、先のWorksheetを例にとると、
このように選択肢から選んで入力することもできます。
日本語入力をOFFのまま日本語変数を打てるため、
IME切り替えという日本語変数最大の弱点を補えます。
是非使ってみてください。
よろしければこちらの記事をどうぞ。