パンくず
リファクタリング-プログラマーの体質改善テクニック
オブジェクト間での特性の移動
メソッドの移動:Move Method
内容
適用ケース要約
メソッドが、自分のクラスよりも他クラスの機能を使ったり、他クラスから利用されたりする。
今はそうでなくても、そうなりつつある。
サンプル
とあるプログラマーTbpgとBeckが居るとします。
Tbpgは難しいコードがあるたびにBeckを自席に呼んでコーディングしてもらっていました。
ある時、毎回BeckをつれてくるぐらいならBeckに処理を担当してもらうことにしました。
サンプルコード
▼リファクタリング前
# encoding: Shift_JIS NORMAL_LEVEL="normal" DIFFICULT_LEVEL="difficult" class Tbpg def think() puts "Tbpgは問題を考えています" end def flash() puts "Tbpgは閃きました" end def resolve() puts "Tbpgは問題を解決しました" end def coding(level) if level==NORMAL_LEVEL normal_coding elsif level==DIFFICULT_LEVEL difficult_coding else raise 'error' end end private def normal_coding() think flash resolve end private def difficult_coding() beck=Beck.new beck.think beck.flash beck.resolve end end class Beck def think() puts "Beckは問題を考えています" end def flash() puts "Beckは閃きました" end def resolve() puts "Beckは問題を解決しました" end end tbpg=Tbpg.new tbpg.coding(NORMAL_LEVEL) tbpg.coding(DIFFICULT_LEVEL)
▼リファクタリング後
# encoding: Shift_JIS NORMAL_LEVEL="normal" DIFFICULT_LEVEL="difficult" class Tbpg def think() puts "Tbpgは問題を考えています" end def flash() puts "Tbpgは閃きました" end def resolve() puts "Tbpgは問題を解決しました" end def coding(level) if level==NORMAL_LEVEL normal_coding elsif level==DIFFICULT_LEVEL Beck.new.coding else raise 'error' end end private def normal_coding() think flash resolve end end class Beck def think() puts "Beckは問題を考えています" end def flash() puts "Beckは閃きました" end def resolve() puts "Beckは問題を解決しました" end def coding() think flash resolve end end tbpg=Tbpg.new tbpg.coding(NORMAL_LEVEL) tbpg.coding(DIFFICULT_LEVEL)
▼出力結果(共通)
Tbpgは問題を考えています Tbpgは閃きました Tbpgは問題を解決しました Beckは問題を考えています Beckは閃きました Beckは問題を解決しました