Tbpgr Blog

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

Ruby | Delivering Output | Represent failure with a benign vlaue

概要

Represent failure with a benign vlaue

前提

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

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

詳細

状況

メソッドは本質的ではない値を返却する。
時々その値はnilである。

概要

呼び元の通常の動作に差し支えない空文字のようなデフォルトの値を返却する。

理由

nilとは異なり、良性の値はNoMethodErrorを防ぐための特別なチェックコードを要さない。

サンプルコード仕様

姓名をメンバにもつPersonクラスを作成します。
fullnameメソッドにより姓名を取得できます。

サンプル1は姓名どちらかがnilの場合に、fullnameメソッドnilを返却します。
この場合、利用側が毎回nilチェックをする必要があります。

サンプル2は姓名どちらかがnilの場合に、fullnameメソッドは空文字を返却します。
この場合、利用側特別なチェックは必要ありません。

サンプルコードその1

class Person
  attr_reader :firstname, :lastname
  def initialize(firstname, lastname)
    @firstname, @lastname = firstname, lastname
  end

  def fullname
    return nil if firstname.nil?
    return nil if lastname.nil?
    "#{firstname} #{lastname}"
  end
end

[
  {firstname: "太郎", lastname: "田中"}, 
  {firstname: "一郎", lastname: "鈴木"}, 
  {firstname: nil, lastname: nil}, 
].each do |names|
  person = Person.new(names[:firstname], names[:lastname])
  puts person.fullname.nil? ? "" : person.fullname
end

出力

太郎 田中
一郎 鈴木
 

サンプルコードその2

class Person
  attr_reader :firstname, :lastname
  def initialize(firstname = '', lastname = '')
    @firstname, @lastname = firstname, lastname
  end

  def fullname
    "#{firstname} #{lastname}"
  end
end

[
  {firstname: "太郎", lastname: "田中"}, 
  {firstname: "一郎", lastname: "鈴木"}, 
  {firstname: nil, lastname: nil}, 
].each do |names|
  person = Person.new(names[:firstname], names[:lastname])
  puts person.fullname
end

出力

太郎 田中
一郎 鈴木