自分はExcelVBAの案件ばかりに突っ込まれることが多かったので、おそらくエンジニアの中でも、かなりExcelVBAの経験が長いと思います。
その経験から言うと、しっかりとした管理がなされている現場では、ハンガリアンで命名をするという現場がほとんどです。
そういったしっかりした現場に入ったときに、ハンガリアンを使用しないと「ん?」と思われる可能性もあるので気をつけたほうが良いですね。
例えば以下のような命名規則です。
intCount
lngRowNo
strCellValue
blnIsActive
Public Sub pSubPrint
Private Sub mSubPrint
VBAに限らず、VB6.0、JavaScript、.NET(C#、VB.net)当たりのマイクロソフト系のアーキテクチャではハンガリアンが多いイメージです。
(単純に昔はハンガリアンが流行っていたというだけかもしれませんが)
ハンガリアンは時代遅れ?
しかし、最近では「ハンガリアンは駄目」という意見が多い気がします。実際、最近の言語で使用しているイメージはほぼ無いですね。
その反対派の主張で多いのが
- 変数の型が変わったときのリファクタリングが面倒
- 変数名が長くなりがち
というものです。
個人的にグローバル変数でない限りIDEで関数単位で変数名を一括置換してしまえばいいし、そもそも変数の型ってあまり変わらない気がするので、そこまでデメリットに感じていません。
そしてVBAの特有の問題として
- オブジェクト型やVariant型に何が入っているのかわからん
- オブジェクト指向の言語と比較して関数が肥大化しがち
- Integerの範囲が狭すぎてバグを生みやすい
- パッケージがないため、モジュール名はアプリケーションハンガリアンしたい
という問題があるため、ハンガリアン記法は有効だと考えています。1つずつ詳細を記載していこうと思います。
オブジェクト型やVariant型に何が入っているのかわからん
実行時バインディングをする場合、オブジェクトに何が入っているかを表すためにシステムハンガリアンで書くことは重要かと思います。
例えばですが…
Dim fruitsList AS Object
Set fruitsList = CreateObject("Scripting.Dictionary")
上記だとフルーツの配列なのかなというのが変数から読み取ることが出来ますが、Dictionaryということが読み取れません。
変数宣言まで飛んだとしても、Object型であるため実態がつかめません。
そこで下記のように接頭に型を表すようにしてあげればわかりやすいです。
Dim dicFruits AS Object
Set dicFruits = CreateObject("Scripting.Dictionary")
この時注意したいのは、objとしないでしっかり何を入れるかを書くことですね。
これを書いておくことにより、オブジェクトを使い回す(再代入する)ということも抑制できるかと思います。
オブジェクト指向の言語と比較して関数が肥大化しがち
VBAはByRef(参照渡し)を使えるので、1関数のコードを減らせるポテンシャルはかなりあると思います。
…が基本的には1関数にダラダラと書いていくのが、お作法になっている現場が多い気がします。
というのも、関数の数が増えてくると可読性が落ちてくるのですよね。クラスで機能をまとめていけばマシかもしれませんが、あまり使用しているところを見たことがないです。
酷い時には、1関数が1000行位あることもあるのですが、そうなってくると変数名を見ただけで型がわかるメリットが大きくなってきます。
Integerの範囲が狭すぎてバグを生みやすい
Integerの範囲がかなり小さくなっていて、-32,768 ~ 32,767です。
つまり16ビット数ということですが、他のプログラミング言語ではshort型に該当することが多いですよね。
そしてExcel上で32,767以上の数を扱うことはよくあるので、Integerを使用している時は特に気をつけないと、すぐバグります。行番号のループがIntegerだったりね…。
ということで、「rowNumber」みたいな変数名にされると怖すぎるのですよ。しっかりLong型にしてるぞってのを明記してほしいです。
パッケージがないため、モジュール名はアプリケーションハンガリアンしたい
モジュール名の接頭文字に、そのモジュールの区分をプレフィックスとしてつけておきたいです。
というのもパッケージの概念がないため、モジュールが増えてくると探すのが滅茶苦茶大変になるからです。
例えば以下のような感じです。
enFileInput
enFileOutPut
enReadSheet
jpFileInput
jpFileOutPut
jpReadSheet
仮に日本語読み込みと英語読み込みの機能があるプロジェクトだと仮定すると、接頭に「jp」、「en」とかつけておくだけでそのモジュールが格段に探しやすくなります。
6個程度なので全然大丈夫ですが、100個とかなってくると接頭を揃える重要性がわかってくると思います。
キャメルケースのほうが多く使われる
キャメルケース→intRowNo
スネークケース→int_row_no
VBAの現場ではキャメルケースが圧倒的に多いですね。
PHPとかの現場でもキャメルケースが多いですが、スネークケースのが良いなあと思うことも多いです。
というのも作法的にDBはスネークケースのことが多いので、selectしてきた値をそのまま使えるからです。(今だとキャメル⇔スネークの変換なんて自動でできるぞと言われそうですが…)
個人的にVBAでどちらが良いかは微妙なところですね。
まあパッと見たときの読解度はスネークケースのが上な気がしますが、浮く可能性もあるのでキャメルケースにしておいたほうが無難かもしれません。
コメントを残す