Tbpgr Blog

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

書籍 リファクタリング−プログラマーの体質改善 | データの再編成 | 参照から値への変更

内容

リファクタリング

参照から値への変更

適用ケース要約

小さくて不変でコントロールが煩わしい参照オブジェクトを持っている。

適用内容要約

そのオブジェクトを値オブジェクトに変える。

適用詳細

参照として実装していたが、オブジェクトとして扱う手間のほうが
コストが大きい場合や、分散処理向けに値オブジェクトで扱いたい時に
この方法を適用します。
手順は値から参照への変更の逆になります。

サンプル

ビックリマンシールを表すクラスからデータを取得することを想定します。
シールを表すBikkuriManクラスはシールの名前とIDを保持します。
はじめはシールの情報を参照で返却していましたが、
値で取得するようにリファクタリングします。

サンプルコード

リファクタリング

class BikkuriMan
  attr_accessor:id,name
  def initialize(id,name)
    @id=id
    @name=name
  end
  
  def display_card_info()
    puts "#{@id }:#{@name}"
  end
end

class BikkuriManFactory
  @@card_map={5=>BikkuriMan.new(5,"火消し助六"),8=>BikkuriMan.new(8,"一発助役")}
  
  def self.get_card(id)
    return @@card_map[id]
  end
  
end

bikkuri_man1=BikkuriManFactory.get_card 5
bikkuri_man1.display_card_info
bikkuri_man2=BikkuriManFactory.get_card 8
bikkuri_man2.display_card_info

リファクタリング

# encoding: Shift_JIS

class BikkuriMan
  attr_accessor:id,name
  
  def initialize(id,name)
    @id=id
    @name=name
  end
  
  def display_card_info()
    puts "#{@id }:#{@name}"
  end
end

bikkuri_man1=BikkuriMan.new(5,"火消し助六")
bikkuri_man1.display_card_info
bikkuri_man2=BikkuriMan.new(8,"一発助役")
bikkuri_man2.display_card_info

出力(共通)

5:火消し助六
8:一発助役