ガード節より読みやすい!?途中リターンせずにネストを浅くするテクニック

プログラムで値のチェック処理等を書くとき、普通に分岐構造を使っていると、ネストが深くなっていってしまいます。

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個 _ えんじにゃーブログ

コードのネストを深くするな

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です