パンくず
リファクタリング-プログラマーの体質改善テクニック
データの再編
値から参照への変更
内容
リファクタリング名
値から参照への変更
適用ケース要約
同じインスタンスをいくつも生成するクラスがあり、それらのオブジェクトを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:一発助役