ガード節とは
ガード節(Guard Clause)は、If
文などの条件分岐のネスト(入れ子構造)を深くしないための技法の1つです。ガード条件と呼ばれることもあります。
ガード節の考え方を文章にすると、「条件節が主に例外的な条件であって返り値が例外的な値なのであれば、処理の冒頭部分で条件判断とExit sub
やExit For
、Exit Do
などをおこなって例外処理を完結させ、メインの処理に影響を与えないようにする」ということになります。
ガード節の例
次のIf
文を見てください。
If (よくあるケース/正常なケース) Then ' 通常の処理 ElseIf (比較的特殊なケース) Then ' 特殊な処理1 ElseIf (さらに特殊なケース) Then ' 特殊な処理2 End If
このIf
文に続く後処理がない場合、Exit Sub
に逃げることで、表現をシンプルにすることができます。
If (比較的特殊なケース) Then ' 特殊な処理1 Exit Sub End If If (さらに特殊なケース) Then ' 特殊な処理2 Exit Sub End If If (よくあるケース/正常なケース) Then ' 通常の処理 End If
このように書き換えることを、「ガード節による入れ子条件記述の置き換え」といいます。
ElseIf
のない分、構造がシンプルになっています。
リファクタリングとは
処理内容を変えずにソースコードの内部構造を変更することです。上の例のように、ElseIf
を使った文を、3つのIf
文に分割することです。
他の言語では、たくさんの書籍が販売されるほど議論されているコード改善手法です。
でも、VBAでは「ガード節」も「リファクタリング」もほとんど使われません。
なぜ使われないのか
ExcelVBAを実務で使い倒す技術という書籍には、「リファクタリングでチームのコードに一貫性を持たせる」という記事があります。
ここでの取り上げ方には特徴があります。
リファクタリングを、チームでのVBAの共同コーディング作業について取り上げている点です。
これからわかることは、VBAでは、専門家がチームでコーディングすることが少ないだろう、ということです。
裏を返せば、VBAでは、ノンプログラマが個人作業でコーディングをしているために、ガード節という言葉もリファクタリングという概念もほとんど意識されない、ということです。
じゃあどうするの
チームでVBAのコーディングをするような専門家は、もちろん他の言語も勉強しているので、リファクタリングなんて当たり前に知っているでしょう。
しかし、VBAは 事務作業の延長 として、ノンプログラマが個人作業でコーディングをおこなっていることが圧倒的に多いので、リファクタリングは浸透しないのでしょう。
じゃあ、ノンプログラマはどうしたらいいかと言えば、地道に他言語の勉強の中でリファクタリングを覚えていくしかないでしょうね、現状では。
ちなみに、上にあげた本はリファクタリングの例としてはあまりできがよくないので、リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニックのような本をおすすめします。
どなたか優秀な方が、VBAにおける「ガード節」や「リファクタリング」を取り上げた書籍を執筆してくれることを望みます。