 
Guard Clause in VBA
はじめに
ガード節(Guard Clause)は、If文などの条件分岐のネスト(入れ子構造)を深くしないための技法の1つです。ガード条件と呼ばれることもあります。
ガード節の考え方を文章にすると、『「条件節が主に例外的な条件であって返り値が例外的な値なのであれば、処理の冒頭部分で条件判断とExit subやExit For、Exit Doなどをおこなって例外処理を完結させ、メインの処理に影響を与えないようにする』ということになります。
ガード節とリファクタリング
このガード節という考え方はリファクタリング、処理内容を変えずにソースコードの内部構造を変更することをおこなう上では必須の考え方のひとつです。
なんでこんなリファクタリングなどという当たり前のことを書くかというと、普通にVBAを書いているだけのノンプログラマは絶対に「リファクタリング」という用語を知らないからです。
もちろん「リファクタリング」という言葉を知らなくても、実際にはリファクタリングをおこなっている優秀なノンプログラマはいるでしょうけど、一部の例外を除いて、VBAの専門書籍では「リファクタリング」という言葉は出てきません。
だいたいのノンプログラマにとってVBAは「動けばいいもの」であって、けっして「処理内容を変えずにソースコードの内部構造を変更する」ことを必要とするものではないからです。
これは職業プログラマからVBAがバカにされる一因です。
わたしも「リファクタリング」や「ガード節」という言葉は知りませんでした。
しかし、知らなくても「ガード節」は使っていました。
ガード節の例
次のIf 〜 Then 〜 End IF文を考えてみましょう。
If (よくあるケース/正常なケース) Then
    ' 通常の処理
ElseIf (比較的特殊なケース) Then
    ' 特殊な処理1
ElseIf (さらに特殊なケース) Then
    ' 特殊な処理2
End If
このIf 〜 Then 〜 End If文に続く後処理がない場合、Exit Subに逃げることで、表現をシンプルにすることができます。
If (比較的特殊なケース) Then
    ' 特殊な処理1
    Exit Sub
End If
If (さらに特殊なケース) Then
    ' 特殊な処理2
    Exit Sub
End If
If (よくあるケース/正常なケース) Then
    ' 通常の処理
End If
これは「ガード節による入れ子条件記述の置き換え」というものです。
書かれてみれば、当たり前の表現ですが、同じ処理でも後者の表現のほうがわかりやすいと思います。
ガード節を利用できないケース
Private Sub Workbook_Open()
    If F_CheckUpFile = False Then
        Workbooks.Open Filename:="zenkoku.xlsm", ReadOnly:=True
        ActiveWindow.Visible = False
    End If
    Worksheets("NoticeOfDishonor").Activate
    Range("AG3").Activate
    Call S_AddKeysToMacro
End Sub
この表現は、この記事から引用したものですが、この中で使われているIf文には、後に処理が続くので、リファクタリングすることはできません。
VBAの専門書でリファクタリングが扱われているケース
ExcelVBAを実務で使い倒す技術という書籍には、「リファクタリングでチームのコードに一貫性を持たせる’という記事があります。
この記事のいいところはVBAの書籍ではめったに触れられることのない「リファクタリング」という言葉を紹介している点です。
逆に、この記事の残念なところは「リファクタリング」をチームでの共同作業に限定している点です。
「リファクタリング」はチームでなく1人でプログラミングしているときも必要な作業です。
なのに、チームでの共同作業に限定しているのはとてももったいないと思います。
みなさんは1人でもどんどん「リファクタリング」してくださいね。
おわりに
「リファクタリング」を勉強したいみなさんにはリーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニックをおススメします。
ぜひ読んでみてください。

 
	        	        		 
	        	        		 
	        	        		 
	        	        		 
	        	        		 
	        	        		 
	        	        		 
	        	        		 
						
コメントを残す