リーダブル・マイコーディングルール
テキスト
excelVBAを実務で使い倒す技術
リーダブルコード
CODECOMPLETE上
1 方針
誤解が少ない書き方を優先。
理解しやすい書き方を優先。
書き手の便宜より読み手を優先。
大差なければ、従来からの一貫性ある書き方(自分の書き方)を徹底。
細かいルールよりも、この方針を優先する。
2 格言、心がけ
より速く理解できるコードが優れている。
ネストは浅く。ネストが深いと読みにくい。
コードは推理小説ではない。コードを「推理」していることに気づいたら、変数名を変更することを検討する。コードは推理する必要などないはずである。
現代の言語では、意味のある名前をわざわざ短くする必要はない。(古い言語(BASIC等)は2~8文字の制限があった。)
コードのリテラルを根絶する。2,3,4,5,6,7,8,9,を使っていないか検索する。
たとえ安全でもリテラルを使用しない。リテラルを後から修正するのは困難。
3 ルール
#変数
##変数宣言を強制
[ツール][オプション][編集][編集の宣言を強制する]
#変数名
##変数が表すものを完全に説明するような名前をつける。
※変数が表すものを言葉で表現してみる。解読する必要がないほどの十分な長さで。
’NG current,cd,x1
’OK currentDate,todaysDate
##方法(how、解決策)ではなく、もの(what、問題)。
計算の一部を表す名前ではなく、問題そのものを表現する。
’NG inputRec,bitFlag,calcVal
’OK employeeData,printerReady
##変数名が10~20文字に達していない場合は、名前が明確か疑う。
’NG max,points
’OK teamPointsMax,teamMemberCount
##使用頻度が少ない変数やパブリック変数には長い名前が向いている。
##計算値で修飾する場合は、名前末尾につける。
###Numは避け、総数はCount,Total,特定はIndexでする。
##反意語
Ex. source/target, source/destination
##ループ変数
ループ変数も情報源になる(コードの目的がわかる)名前を付ける。
3行以上のループ、ネストしたループにはi,j,kより意味のある名前をつける。。コードは変更、拡張、コピーされることが多い。混線(どれがどのインデックスなのかわからなくなるの)を避ける。
’NG i,k
’OK iCountry, month
##状態変数(プログラムの状態を説明)にFlagは使わない。もっといい名前がある。
’NG statusFlag, printFlag
’OK characterType, reporType
##ブール型変数
'OK is, has, can, done, error, found,ready,success(可能ならもっと具体的名前)
'NG status,sourceFile,Flag, notFound(否定形)
##省略する必要はないが、それでも省略するなら省略法に一貫性を持たせる。
’NG NumとNoの共生、NumberとNumの共生
##それでも省略するなら、変換表を用意する。
##それでも省略するなら、発音できる名前にする。
##意味が似ている名前を使わない。先頭、末尾を変える、2文字以上差異を作る。
##似た発音の名前を使わない。
’NG rapとwrap
##名前に数字は使わない。もっといい名前がある。それでも使うなら、配列を使う。
’NG file1とfile2、tatal1とtotal2
’OK highway405などの固有名詞
##名前の綴りを故意に変えない。
’NG higlightをhiliteなどと短縮する。
##綴り間違いが多い単語は避ける
’NG absence,accummulate,acsend,calender,recipt...
##複数の自然言語を組み合わせない
##変数が表すものと無関係な名前を使わない
’NG margaret
##読みにくい文字文字が含まれた名前を避ける
’NG (1とl)、(1とⅠ)、(.と,) 、(0とO)、(2とz)、(;と:)、(sと5)、(Gと6)
##暗黙の型は使わない(型は定義する)
##Variant型、Object型は極力使わない
##パブリック変数、モジュールレベル変数は極力使わない
※イベントプロシージャAuto_Openと組み合わせてフォルダパスなどを定数的に使いたい場合は使用可
#命名規則
C_ClassName :クラス名はプレフィックスをつけて、1文字目大文字。
T_TypeName :型の定義(列挙型)。1文字目大文字。
(T_EnumeratedTypes) :(加えて、列挙型は常に複数形とする)
RoutineName() :ルーチン名は1文字目大文字。
g_globalVariable :パブリック変数(グローバル変数)にはg_でレベル表示。
m_classVariable :モジュール(クラス)レベル変数にはm_でレベルを表示。
localVariable :ローカル変数は1文字目を小文字。内容を表現。
routineParameter :ルーチンの引数はローカル変数と同じ
CONSTANT_SNAKE :名前付き定数はすべて大文字のSNAKE
Base_EnumeratedType :列挙型はデータ型を単数形でプレフィックス。
意味のプレフィックス
first / last :配列内の処理の最初/最後の要素
max / mini :配列(リスト)自体の絶対的な最初/最後の要素
lim :lim = last + 1
total=count :
##列挙型定数
グループを示すプレフィックスを使う。
Ex.Color_,Month_ など。
Public Enum Color
Color_Red
Color_Green
Color_Blue
End enum
マジックナンバーではなく、名前付き定数を使う。無理なら、最後の手段として、g_変数を使う。名前つき定数を使えば、100のどれかを見落としたり、別の意味で使っている100を誤って変更したりしないで済む。変更されない確信があっても、名前つき定数を使用する。
##プログラム本文で使用するリテラルは0と1のみが原則。
0と1以外のリテラルはもっと分かりやすく置き換える。
##マジックキャラクタ(本文中の文字リテラル”A”)やマジックストリング(本文中の文字列リテラル”Spescial Accounting Program”)を使わない。代わりに名前付き定数を使用する。無理なら、g_変数を使う。マジックストリングは何らかのタイミングで変更される可能性がある。
##名前付き定数を一貫して使用する。
名前付き定数とリテラル値が混在していると、後から修正するのが困難。ハードコーティングされたリテラルのことは忘れている。
##配列
配列にランダムアクセスしない。シーケンシャルにアクセスする。
配列の終端(「最初の要素」、「最後の要素」)で「1つ違いエラー」を検査する。
##配列のインデックスの混線に注意する。
インデックスの名前をi,jより意味のある名前にして混線防止を検討する。
#条件
##条件式は、左に判定対象、右に基準。
##ノットイコールはA<>B。
Notはできるだけ使わない。使うときはNot(A=B)とカッコで括る。
##ブール型の条件式にはNotを使う。
=True、=falseは省略する。=falseはNotを使う。
ただし、NotとElseは二重否定になり混乱するので理解しやすさを優先して書く。
4 感心したコーディング例
5 コーディングルール綺麗にまとめてあった。
https://tonari-it.com/excel-vba-coding-guide-line/
http://www.thom.jp/vbainfo/codingguideline.html
https://qiita.com/mima_ita/items/8b0eec3b5a81f168822d