はじめに
どうも、きいちろーです。
みなさんは普段名前って気にしていますか?
例えば新しくフォルダーを作った時にフォルダーに名前をつけてますか?それとも「新しいフォルダー」のままですか?
私はすごーく気にしてつけています。
なぜかというと、名前はちゃんと使えば仕組みになるのを知っているからです。
「山田 貴司」と固有名詞を作ったり、「山田 家」とグループ化することもできるのが名前です。
「なんちゃら」なんて付けられると誰?ってなります。よね?
プログラムにおいても同じことが言えるので、今日はそのことについて書きます。
例えば行番号の変数に名前を付けるとき、私がつける変数名と悪い変数名を載せます。
私の変数名: lv_Row_
悪い変数名: i
悪い変数名は昔からある悪習で、1文字なので入力が楽なのですが後先が大変になります。
この違いの良し悪しを5つのポイントに分けて説明します。
ポイント1
変数名は一目見てわかりやすいものが良いです。
lv_Row_ であれば Row ということで「行」だということが一目でわかります。
i だと何の変数なのかがわからず、判明するまで時間がかかることになります。
ポイント2
変数名は3文字以上にします。
変数名はあとでネーミングが良くないとして変更することがあります。
この時検索や置換の機能を使いますが、
lv_Row_ で検索するとこれしかヒットしないので置換も一瞬で済みます。
i で検索すると print とか line など、 i が含まれている余計なキーワードまでヒットしてしまいますので、そうすると検索したい変数にたどり着くのに時間がかかったり、一括で置換ができなくなります。
こういったことから名前は3文字以上の方がいいと思いますが、長すぎても見づらいので解読しやすい略称を多用します。
あと漢字だったら1文字でもOKです。 lv_行_ とかです。
ポイント3
名前の最後にはアンダーバーを付けます。
例えば以下のような2つの変数があったとします。
lv_Row
lv_RowList
この時 lv_Row を検索したときに lv_RowList までヒットしてしまいます。
これでは名前を変更したいときに一括で置換することができません。
しかし最後にアンダーバーを付けるとどうでしょう。
lv_Row_
lv_RowList_
ここで lv_Row_ で検索をすると lv_RowList_ はヒットされませんので検索性が良くなります。
ポイント4
変数名に属性の文字を持たせます。
プログラムでは変数のほかにもモジュール、定数、関数、ボタンなどを扱うので、それらにも必ず名前を付けることになります。
そこでそれらが一目で見分けられるような属性の文字をつけます。
変数なら v です。
lv_Row_ の v は変数という意味だったのです。
ちなみに変数 variable の頭文字です。
モジュール(module)なら m 、定数(constant)なら c 、関数(function)なら f という形で以下のようにつけていきます。
- sm_支払処理_ 支払処理の標準モジュール
- mc_TaxRate_ 消費税率の定数
- mf_Is税込価格_ 税込価格かどうかをチェックする関数
ポイント5
属性に修飾文字を使って分類することです。
変数にもいろんな種類があるのでそれを使い分ける必要があります。
そこで修飾文字を使います。
例えば関数の中だけで使うなら l ( local のエル)、モジュールの中で横断的に使うのであれば m ( module のエム)という具合です。
lv_Row_ は l なので関数内で使う変数ということになります。
mv_Message_ は m なのでモジュール内にあるいろいろな関数で使える変数ということになります。
ただしモジュール内で使える変数はどこの関数で中身が変わったのかがわかるようにする仕組みが必要です。
また、VBAではモジュールが4つあり、これらにもそれぞれ修飾文字をつかって分類します。
ワークシートモジュールの w ( worksheet )、標準モジュールの s (standard)、フォームモジュールの f ( form )、クラスモジュールの c ( class ) という形です、以下例です。
wm_支払帳簿_ ワークシートモジュール
sm_支払処理_ 標準モジュール
fm_支払伝票_ フォームモジュール
cm_Table_ クラスモジュール
おわりに
以上5つのポイントを書いてみましたので以下にまとめます。
- 変数名はわかりやすいものにすること
- 変数名は3文字以上にすること
- 名前の最後にはアンダーバーを付けること
- 変数名に属性文字をつけること
- 属性文字に修飾文字をつけること
これらはいずれも私が実践していてベストだと思った命名規則です。
賛否両論あるとは思いますが参考程度にしていただければと思います。
最後に私の使っている属性文字と修飾文字を添付します。
属性文字
*c_ 定数
*e_ enum
*f_ function関数
*p_ property
*s_ sub関数
*m_ モジュール
*t_ フォームのツール(テキストボックス、リストなど)
*v_ 変数
修飾文字
l*_ Local level
m*_ Module level
g*_ Global level
修飾文字と属性文字
lc_ 関数内で使う定数
mc_ モジュール内で使う定数
gc_ プログラム全体で使う定数
lv_ 関数内で使う変数
mv_ モジュール内で使う変数
gv_ プログラム全体で使う変数(あまり使わない)
av_ 引数として使う変数
ms_ モジュール内で使うsub関数
gs_ プログラム全体で使うsub関数
mf_ モジュール内で使うfunction関数
gf_ プログラム全体で使うfunction関数
gp_ プログラム全体で使うプロパティ
me_ モジュール内で使うenum
wm_ ワークシートモジュール
fm_ フォームのモジュール
cm_ クラスのモジュール
sm_ 標準モジュール
フォームモジュールのツール
lblt_ label ラベル
txtt_ textbox テキストボックス
tgrt_ toggle トグルボタン
optt_ option オプションボタン
chkt_ checkbox チェックボックス
cmbt_ combobox コンボボックス
lstt_ listbox リストボックス
imgt_ image イメージ
tabt_ tabstripタブストリップ
mltt_ multipage マルチページ
scrt_ scrollbarスクロールバー
spnt_ spinbuttonスピンボタン
reft_ refEdit frmt_ frame フレーム
btnt_ command button コマンドボタン