判断と処理を分けると、読みやすく、テストしやすく、デバッグしやすくなります。
例は javascriptで書いています。
1.初期バージョン
最初に書くバージョンはだいたいこんな感じです。
「もろもろの処理」は、複数行だったり、if文やfor文を含むことがあります。
function func2 (a, b) {
if (a > 10) {
if (a > 20) {
if (a > 30){
もろもろの処理_1
} else {
もろもろの処理_2
}
} else {
もろもろの処理_3
}
} else {
もろもろの処理_4
}
}
2.もろもろの処理をそれぞれ別メソッドにします。
function func2 (a, b) {
if (a > 10) {
if (a > 20) {
if (a > 30){
func2_1();
} else {
func2_2();
}
} else {
func2_3();
}
} else {
func2_4();
}
}
function func2_1() {
もろもろの処理_1
}
function func2_2() {
もろもろの処理_2
}
function func2_3() {
もろもろの処理_3
}
function func2_4() {
もろもろの処理_4
}
3.「判断」と「処理」を別メソッドにします。
function func2 (a, b) {
var num = case_number(a, b);
process(num);
}
function case_number(a, b) {
var num = 0;
if (a > 10) {
if (a > 20) {
if (a > 30){
num = 1;
} else {
num = 2;
}
} else {
num = 3;
}
} else {
num = 4;
}
return num;
}
function process(num) {
switch (num) {
case 1:
func2_1();
break;
case 2:
func2_2();
break;
case 3:
func2_3();
break;
case 4:
default:
func2_4();
break;
}
}
4.判断内のif文のネストをelse〜ifで小さくします。
function case_number(a, b) {
var num = 0;
if (a <= 10) {
num = 4;
} else if (a <= 20) {
num = 3;
} else if (a <= 30) {
num = 2;
} else {
num = 1;
}
return num;
}
5.デシジョンテーブル風のコメントをつけておきます。
/*
| # | a | action |
| - | ----- | ------- |
| 4 | <= 10 | func2_1 |
| 3 | <= 20 | func2_2 |
| 2 | <= 30 | func2_3 |
| 1 | > 30 | func2_4 |
*/
function func2 (a, b) {
...
}
6. if文の条件式が長いときは、それぞれ別メソッドにします。
function case_number(a, b) {
var num = 0;
if (is_later_equal(a, 10)) {
num = 4;
} else if (is_later_equal(a, 20)) {
num = 3;
} else if (is_later_equal(a, 30)) {
num = 2;
} else {
num = 1;
}
return num;
}
function is_later_equal(a, x) {
var f = (a <= x);
return f;
}
最後に、func2メソッドの処理をとりだして、別クラスにします。