読者です 読者をやめる 読者になる 読者になる

Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

Ruby | Collecting Inputs | Bundle arguments into parameter object

Confident Ruby Ruby

概要

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で絵を書きました。