プログラムで値のチェック処理等を書くとき、普通に分岐構造を使っていると、ネストが深くなっていってしまいます。
if (a != null) {
// :
if (b > 0) {
// :
if (check(c)) {
// :
result = 'success';
} else {
result = 'c is failed';
}
} else {
result = 'b <= 0';
}
} else {
result = 'a is null';
}
return result;
ネストが深くて読み難いですよね。
ガード節を使ってネストを浅くする場合
ネストを浅くする手法としては、ガード節が紹介されているのをよく目にします。
if (a == null) {
return 'a is null';
}
// :
if (b <= 0) {
return 'b <= 0';
}
// :
if (!check(c)) {
return 'c is failed';
}
// :
return 'success';
これで、ネストを浅くすることができました。
しかし、その代わりにreturn
を処理の途中で何回も書いています。途中return
を使って分岐構造を壊してしまうことで、分岐自体を見落としやすくなるといったデメリットもあります。
途中リターンしなくてもネストは浅くできる
ガード節に代えて、以下のように書くのはどうでしょうか。
i = 0;
proceed = a != null;
if (proceed) {
i++;
// :
proceed = b > 0;
}
if (proceed) {
i++;
// :
proceed = check(c);
}
if (proceed) {
i++;
// :
}
result = [
'a is null',
'b <= 0',
'c is failed',
'success',
];
return result[i];
用意するのは、処理がどこまで進んだかを覚えておくための変数i
と、次の処理に進めるかを判定するための変数proceed
です。
一度判定がfalse
になると、それ以降のif
ブロックはすべてスキップされるので、何回もreturn
を書く必要がありません。また、処理の結果がresult
にまとめられるところもポイントです。
途中return
を使わずにネストを浅くするテクニック、是非皆さんも試してみてください。
参考
プログラムの可読性を上げるための条件分岐を減らす方法7個 _ えんじにゃーブログ
https://eel3.hatenablog.com/entry/20121225/1356443485
http://tommy-dsp.hatenablog.com/entry/2017/10/31/000745
http://takmiy.hatenablog.com/entry/2020/02/12/104346
https://anopara.net/2014/06/27/do-not-write-deep-nested-code/