僕はプログラミングの際、設計についてはあまり考えず、必要な機能を満たすコードをガーッと書いて、あとでザクザクとリファクタリングすることが多い。クラス数が元の何倍になることもある。
とはいえ、完璧主義の僕にとってリファクタリングは、いくらやっても終わらないハマりポイントになりがちだ。なので、コードからなんとなく漂う違和感がなくなった段階で、思いきって終わりにするしかない。
下記は、リファクタリング途中のコードを模式化したものです。さて、僕はどこまでリファクタリングしたでしょうか。
class PetOwner def initialize(pet) @pet = pet end def work case @pet.type when 'dog' self.buy_dog_food when 'rabbit' self.tidy_up_room when 'bird' self.close_window end end ... end
答は後日。細かい点は気にせず、インスタンス変数のプロパティに応じて異なるメソッドを呼んでいる構造にのみ注目してください。
追記(2016-03-15)
こんな感じにした。
class PetOwner def initialize(pet) @pet = pet end def work self.fulfill(@pet.owners_duty) end ... end class Pet def initialize(type) @type = type end def owners_duty case @type when 'dog' BuyingDogFood.new when 'rabbit' TidyingUpRoom.new when 'bird' ClosingWindow.new end end end
- case文をPetクラスに移動した。typeによる分岐はPetクラスの責務だと思ったので。
- PetOwnerクラスのインスタンスをPetクラスのメソッド引数で渡すのは避けた(なんとなく)。
これでよかったのかどうか、今はまだ分からない。とりあえず寝よう。