Tbpgr Blog

Organization Development Engineer tbpgr(てぃーびー) のブログ

Ruby | Collecting Inputs | Bundle arguments into parameter object

概要

Bundle arguments into parameter object

前提

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

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

詳細

状況

複数メソッドが同じパラメータリストをとる場合。
例えば多くのメソッドがX/Yからなる2Dの座標を利用する。

概要

一般的に一緒に現れるパラメータを新たなクラスの中に組み合わせる

理由

パラメータオブジェクトクラスは混ざったパラメータの振る舞いを引きつける"磁石"として働く

サンプルコード仕様

鉛筆クラスを作成します。
色と濃さを引数にした文字を書くメソッド
色と濃さを引数にした絵を書くメソッド
を保持しています。

サンプルコード(適用前)

色と濃さを毎回各メソッドに渡します。

class Pencil
  def write_charactors(color, deapth)
    "#{color}色、濃さ#{deapth}で文字を書きました。"
  end

  def write_pictors(color, deapth)
    "#{color}色、濃さ#{deapth}で絵を書きました。"
  end
end

pencil = Pencil.new
puts pencil.write_charactors("", "B")
puts pencil.write_pictors("", "HB")

出力

赤色、濃さBで文字を書きました。
緑色、濃さHBで絵を書きました。

サンプルコード(適用後)

class Pencil
  def write_charactors(pencil_style)
    "#{pencil_style.color}色、濃さ#{pencil_style.deapth}で文字を書きました。"
  end

  def write_pictures(pencil_style)
    "#{pencil_style.color}色、濃さ#{pencil_style.deapth}で絵を書きました。"
  end
end

PencilStyle = Struct.new(:color, :deapth)

pencil_style1 = PencilStyle.new("", "B")
pencil_style2 = PencilStyle.new("", "HB")

pencil = Pencil.new
[pencil_style1, pencil_style2].each do |pencil_style|
  puts pencil.write_charactors(pencil_style)
  puts pencil.write_pictures(pencil_style)
end

出力

赤色、濃さBで文字を書きました。
赤色、濃さBで絵を書きました。
緑色、濃さHBで文字を書きました。
緑色、濃さHBで絵を書きました。