Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Collecting Inputs | Substitute a benign value for nil

概要

Substitute a benign value for nil

前提

Confident Rubyではメソッド内の処理を次のように分類しています。
・Collecting Inputs(引数チェック、変換など)
・Performing Work(主処理)
・Delivering Output(戻り値に関わる処理)
・Handling Failure(例外処理)

当記事は上記のうち、Collecting Inputsに関する話です。

詳細

状況

本質的な入力がいつも提供されなとは限らない。
例えばソーシャルグループのメンバーのリストにおいて、
ある人のgeolocationデータがいつも利用できるとは限らない。

概要

欠落したパラメータを既知の良性の値に置き換える

理由

既知のplaceholderはオプション情報の存在のための退屈なチェックを排除することができる。

サンプルコード仕様

外部で制御されている信号があります。
信号はランダムに赤、青、ついていない、の状態を返します。

利用者は信号が赤なら止まる
利用者は信号が青なら渡る
利用者は信号がついていない場合は渡る

の行動をとります。

サンプルコード(条件分岐版)

通常の条件分岐で対応する場合

module Trafic
  class Signal
    RED = ""
    GREEN = ""
    def self.get_color
      case rand(3).to_i
      when 1
        RED
      when 2
        GREEN
      when 3
        # 深夜など信号が動いていない場合
        nil
      end
    end
  end
end

10.times do
  color = Trafic::Signal.get_color
  case color
  when Trafic::Signal::GREEN
    puts "信号が青なので渡ります"
  when Trafic::Signal::RED
    puts "信号が赤なので待ちます"
  else
    puts "信号がついていないが渡ります"
  end
end

出力(ランダム)

信号が赤なので待ちます
信号が赤なので待ちます
信号が青なので渡ります
信号が青なので渡ります
信号がついていないが渡ります
信号が青なので渡ります
信号が赤なので待ちます
信号がついていないが渡ります
信号がついていないが渡ります
信号がついていないが渡ります

サンプルコード(nilの代わりを代入)

信号の戻り値がnilの場合に、青を代入する場合。
代入後の処理に余分な分岐がなくなります。

module Trafic
  class Signal
    RED = ""
    GREEN = ""
    def self.get_color
      case rand(3).to_i
      when 1
        RED
      when 2
        GREEN
      when 3
        # 深夜など信号が動いていない場合
        nil
      end
    end
  end
end

10.times do
  color = Trafic::Signal.get_color || Trafic::Signal::GREEN
  case color
  when Trafic::Signal::GREEN
    puts "信号が青なので渡ります"
  when Trafic::Signal::RED
    puts "信号が赤なので待ちます"
  end
end

出力(ランダム)

信号が青なので渡ります
信号が赤なので待ちます
信号が青なので渡ります
信号が青なので渡ります
信号が青なので渡ります
信号が青なので渡ります
信号が赤なので待ちます
信号が赤なので待ちます
信号が赤なので待ちます
信号が青なので渡ります