リファクタリングに関する記事です
環境(以下の環境で動作確認をしています)
- Windows 10
- Office 2013
- Access
- VBA ※(言語はVBAを使用しています)
目次
- リファクタリングとは
- リファクタリングのメリット
- ガード節による入れ子条件の削除
- ガード節による入れ子条件の削除(手順)
- ガード節による入れ子条件の削除(サンプルコード)
リファクタリングとは
リファクタリングとは、プログラムの外部から見た動作は変えずに、理解や修正がしやすくなるようにソースコードの内部構造を整理することです。
リファクタリングを行うメリット
リファクタリングを行うことで得られるメリットは様々ありますが、代表的なものを下記に記載します。
- ソフトウェアを理解しやすくする
- バグを見つけ出すことができる
- 拡張性や再利用性が高まる
ガード節による入れ子条件の削除
様々なリファクタリング技法が先人により生み出されましたが、今回はその中の一部を紹介します。
ガード節とは処理の対象外とする条件をプロシージャやループの先頭に集め、対象外の際はExit文を使用し早めに処理を終了させる方法です。深い入れ子構造は「正常」コードの実行時の流れが不明瞭です。カード節を導入することで、深い入れ子構造を排除し正常系と準正常系(エラーではないが不適切な処理)を明確にし、可読性も向上します。
ガード節による入れ子条件の削除(手順)
- If ~ elseを多用し、正常系が分かりにくいプログラムを対象とする
- 準正常系の条件判定を探す
- 準正常系の条件判定している箇所をガード節で置き換える
ガード節による入れ子条件の削除(サンプルコード)
- リファクタリング対象プログラムの概要
【外部設計】
T賃貸物件
F賃貸物件
【処理内容】
・入力された情報を新規賃貸物件情報として登録します
・テーブルに登録できた際は、登録完了のメッセージを表示します
【入力チェック】
入力チェックを行い、メッセージはメッセージボックスで表示し、処理を終了します。
■沿線
・未入力チェック (メッセージ:沿線が未入力です。)
■最寄駅
・未入力チェック (メッセージ:最寄駅が未入力です。)
■徒歩
・未入力チェック (メッセージ:徒歩が未入力です。)
・数値チェック(メッセージ:徒歩には数値を入力してください。)
・範囲チェック(メッセージ:徒歩は0分以上60分以下を入力してください。)
■賃料
・未入力チェック (メッセージ:賃料が未入力です。)
・数値チェック(メッセージ:賃料には数値を入力してください。)
・範囲チェック(メッセージ:賃料は1000円以上200000円以下を入力してください。)
下記は上記仕様に従ったリファクタリング前のプログラムです
【リファクタリング前】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Private Sub cmd登録_Click() '沿線未入力チェック If IsNull(Me!txt沿線) Then MsgBox "沿線が未入力です。" Else '最寄駅未入力チェック If IsNull(Me!txt最寄駅) Then MsgBox "最寄駅が未入力です。" Else '徒歩未入力チェック If IsNull(Me!txt徒歩) Then MsgBox "徒歩が未入力です。" ElseIf Not IsNumeric(Me!txt徒歩) Then MsgBox "徒歩には数値を入力してください。" ElseIf Not IsNumericRange(Me!txt徒歩.Name, Me!txt徒歩.value) Then MsgBox "徒歩は0分以上60分以下を入力してください。" Else '賃料未入力チェック If IsNull(Me!txt賃料) Then MsgBox "賃料が未入力です。" ElseIf Not isNumeric(Me!txt賃料) Then MsgBox "賃料には数値を入力してください。" ElseIf Not IsNumericRange(Me!txt賃料.Name, Me!txt賃料.value) Then MsgBox "賃料は1000円以上200000円以下を入力してください。" Else Call RegistRentalProperty End If End If End If End If End Sub |
正常処理は27行目のRegistRentalPropertyプロシージャの呼び出しですが、条件のネストが深くどのような条件の際に行われるかが非常に分かり難くなっています。
【リファクタリング後】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Private Sub cmd登録_Click() 'ガード節の導入 '沿線未入力チェック If IsNull(Me!txt沿線) Then MsgBox "沿線が未入力です。" Exit Sub End If '最寄駅未入力チェック If IsNull(Me!txt最寄駅) Then MsgBox "最寄駅が未入力です。" Exit Sub End If '徒歩未入力チェック If IsNull(Me!txt徒歩) Then MsgBox "徒歩が未入力です。" Exit Sub ElseIf Not IsNumeric(Me!txt徒歩) Then MsgBox "徒歩には数値を入力してください。" Exit Sub ElseIf Not IsNumericRange(Me!txt徒歩.Name, Me!txt徒歩.value) Then MsgBox "徒歩は0分以上60分以下を入力してください。" Exit Sub End If '賃料未入力チェック If IsNull(Me!txt賃料) Then MsgBox "賃料が未入力です。" Exit Sub ElseIf Not isNumeric(Me!txt賃料) Then MsgBox "賃料には数値を入力してください。" Exit Sub ElseIf Not IsNumericRange(Me!txt賃料.Name, Me!txt賃料.value) Then MsgBox "賃料は1000円以上200000円以下を入力してください。" Exit Sub End If Call RegistRentalProperty End Sub |
5~38行目がガード節です。正常処理を行わない場合の条件を列挙したものです。
ガード節を導入することで、深い入れ子が排除され準正常系処理及び正常処理が明確になります。
他にも色々なリファクタリングの考え方やテクニックは存在しますので、興味がある人は調べてみてください。