Tbpgr Blog

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

書籍 リファクタリング−プログラマーの体質改善 | メソッド呼び出しの単純化 | 引数オブジェクトの導入

内容

リファクタリング

引数オブジェクトの導入

適用ケース要約

本来まとめて扱うべき一覧の引数がある

適用内容要約

それらをオブジェクトに置き換える

適用詳細

ひとまとまりのデータとして意味を持つような引数を複数渡している場合、
それらの引数を新たなクラスにまとめてオブジェクトとして渡します。
引数が減り、可読性が上がると共にメソッドの移動などの前段階としても役に立ちます。

サンプル

姓名の2変数を利用するクラスがあったとします。
このクラスは日本語スタイルで姓名と出力する機能と
英語スタイルで名姓と出力する機能を持ちます。

サンプルコード

リファクタリング

# encoding: Shift_JIS

class NameManager
  def self.get_j_style_fullname(family_name,first_name)
    return "#{family_name} #{first_name}"
  end
  def self.get_e_style_fullname(family_name,first_name)
    return "#{first_name} #{family_name}"
  end
end

puts NameManager.get_j_style_fullname("matsumoto","yukihiro")
puts NameManager.get_e_style_fullname("matsumoto","yukihiro")

リファクタリング

# encoding: Shift_JIS

class NameManager
  def self.get_j_style_fullname(person)
    return "#{person.family_name} #{person.first_name}"
  end
  def self.get_e_style_fullname(person)
    return "#{person.first_name} #{person.family_name}"
  end
end

class Person
  attr_reader:family_name,:first_name
  def initialize(family_name,first_name)
    @family_name=family_name
    @first_name=first_name
  end
end

matsumoto=Person.new("matsumoto","yukihiro")
puts NameManager.get_j_style_fullname(matsumoto)
puts NameManager.get_e_style_fullname(matsumoto)

出力(共通)

matsumoto yukihiro
yukihiro matsumoto