Tbpgr Blog

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

書籍 リファクタリング−プログラマーの体質改善 | データの再編 | オブジェクトによるデータ値の置き換え

パンくず

リファクタリング-プログラマーの体質改善テクニック
データの再編
オブジェクトによるデータ値の置き換え

内容

リファクタリング

オブジェクトによるデータ値の置き換え

適用ケース要約

追加のデータや振る舞いが必要なデータ項目がある

適用内容要約

そのデータ項目をオブジェクトに変える

適用詳細

単純なデータ項目だと判断していた要素が、システムの運用と共に肥大化・複雑化することがあります。
その場合、該当データ(群)をオブジェクトとして抽出します。

サンプル

TODOを取り扱うTODOマネージャー機能を実装します。
リファクタリング前は、TODOの各項目をただのハッシュとして扱っていました。
これをオブジェクトに置換します。

サンプルコード

リファクタリング

# encoding: Shift_JIS

class TodoManager
  attr_accessor:todo_map
 
  # TODOはTODO名、見積時間(30分=1)、実作業時間、完了フラグで構成される
  def add_todo(todo_name,estimate,actual_results,is_finish)
    @todo_map={:todo_name=>todo_name,:estimate=>estimate,:actual_results=>actual_results,:is_finish=>is_finish}
  end
  
  def display_todo()
    @todo_map.each {|key,value|
      puts "#{key}:#{value}"
    }
  end
end

todo_manager = TodoManager.new
todo_manager.add_todo("viの学習 入門","2","0時間38分03秒","true")
todo_manager.display_todo

puts "--------------------------------------------------------------"

todo_manager2 = TodoManager.new
todo_manager2.add_todo("viの学習 中級","8","","false")
todo_manager2.display_todo

リファクタリング

# encoding: Shift_JIS

class TodoManager
  attr_accessor:todo
 
  # TODOはTODO名、見積時間(30分=1)、実作業時間、完了フラグで構成される
  def add_todo(todo_name,estimate,actual_results,is_finish)
    @todo=Todo.new(todo_name,estimate,actual_results,is_finish)
  end
  
  def display_todo()
    @todo.display_todo
  end
end

class Todo
  attr_accessor:todo_name,:estimate,:actual_results,:is_finish

  def initialize(todo_name,estimate,actual_results,is_finish)
    @todo_name=todo_name
    @estimate=estimate
    @actual_results=actual_results
    @is_finish=is_finish
  end
  
  def display_todo()
    todo_map={:todo_name=>@todo_name,:estimate=>@estimate,:actual_results=>@actual_results,:is_finish=>@is_finish}
    todo_map.each {|key,value|
      puts "#{key}:#{value}"
    }
  end
end

todo_manager = TodoManager.new
todo_manager.add_todo("viの学習 入門","2","0時間38分03秒","true")
todo_manager.display_todo

puts "--------------------------------------------------------------"

todo_manager2 = TodoManager.new
todo_manager2.add_todo("viの学習 中級","8","","false")
todo_manager2.display_todo

▼出力結果(共通)

todo_name:viの学習 入門
estimate:2
actual_results:0時間38分03秒
is_finish:true
--------------------------------------------------------------
todo_name:viの学習 中級
estimate:8
actual_results:
is_finish:false