Tbpgr Blog

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

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

パンくず

リファクタリング-プログラマーの体質改善テクニック
データの再編
値から参照への変更

内容

リファクタリング

値から参照への変更

適用ケース要約

同じインスタンスをいくつも生成するクラスがあり、それらのオブジェクトを1個のオブジェクトに圧縮したいと考えている。

適用内容要約

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

適用詳細

データが不変であることが保証されている場合に、そのデータを参照で取り扱うことで
パフォーマンスやリソースを節約することが可能です。

サンプル

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

サンプルコード

リファクタリング

# 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

リファクタリング

# 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

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

▼出力結果(共通)

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