コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

早期returnにおける使い方のパターン(防御的プログラミング、あるいは分岐処理)をざっくりまとめる

自身の書き方を言語化するシリーズ

この文章内での早期returnとは

メソッドなどで処理の終端に到達する前に return をして戻り値を先行して返すこと。

早期returnを利用できるパターン

早期returnが有用なケースをパターン分けすると以下の2つになると考えている

  • 防御的プログラミングでの早期return
  • 分岐処理の早期return

それぞれに関して記述していく

防御的プログラミングでの早期return

メソッドの引数の値がおかしい場合に実処理を行わないなどの防御的プログラミングの文脈でのやりかたは以下の考え方

def half_value(number)
  return_value = nil
  # ゼロを除算するとエラーになるので0より大きな数値
  if number > 0
    return_value = number / 2
  end
  return_value
end

このような事前チェックが必要なタイプはチェックのやり方が有用になる。後置ifが使えるRubyだと更にスッキリできる。

def half_value(number)
  return nil if number > 0
  number / 2
end

分岐処理での早期return

もしかすると 早期return とはこちらの意味合いを保つ場合のほうが多いかもしれないが、こちらの文脈は以下のようなパターン。

お題が以下のようなものだったとする

与えられた数字が2なら与えられた数、2でなかったら与えられた数と1〜10の数を2乗した値を足して返す

def calc(number)
  return_number = 0
  if number == 2
    return_number = number
  else
    rand_set_number = rand(10)^2
    return_number = number + rand_set_number 
  end
  return_number
end

この場合は与えられた数( number )が2だったら後続処理の必要は無いのでreturnできる

def calc(number)
  return number if number == 2
  rand_set_number = rand(10)^2
  return rand_set_number 
  end
  return_number
end

ただし、この分岐処理の早期returnは明確にスイッチング処理になる場合はswitch case文のような記述を行ったほうが見通し良い場合もあるので状況によって書き換えるといい

参考リンク