2016-04-09発売
技術評論社
売り上げランキング: 2,624
2016-04-12発売
技術評論社
売り上げランキング: 25,104
2016-04-15発売
2016-04-16発売
オライリージャパン
売り上げランキング: 1,614
2016-04-28発売
KADOKAWA (2016-04-28)
売り上げランキング: 42,186
僕はプログラミングの際、設計についてはあまり考えず、必要な機能を満たすコードをガーッと書いて、あとでザクザクとリファクタリングすることが多い。クラス数が元の何倍になることもある。
とはいえ、完璧主義の僕にとってリファクタリングは、いくらやっても終わらないハマりポイントになりがちだ。なので、コードからなんとなく漂う違和感がなくなった段階で、思いきって終わりにするしかない。
下記は、リファクタリング途中のコードを模式化したものです。さて、僕はどこまでリファクタリングしたでしょうか。
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
答は後日。細かい点は気にせず、インスタンス変数のプロパティに応じて異なるメソッドを呼んでいる構造にのみ注目してください。
こんな感じにした。
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
これでよかったのかどうか、今はまだ分からない。とりあえず寝よう。
以前「テストを工夫するよりも」という記事で、テスタビリティを重視した設計が好みである旨を書いた。だが、最近は考えが変わりつつある。
「現在時刻に応じて挨拶する」メソッドにおいては、Rubyでいえば「Time.now」で現在時刻を取得するのが、もっとも自然で読みやすい形だろう。テスタビリティを重視して、引数なりインスタンス変数なりを増やしていくと、コードがどんどん複雑になり、理解しづらくなってしまう。
そもそも、Rubyの場合「Time.now」のままでも簡単にテストできる。「時刻ライブラリに介入」できるからだ。そういう言語なら、テストのためだけに(ですよね)コードを変形する必要はないんじゃないですかねえ。
ENECHANGE株式会社VPoT兼CTO室マネージャー。AWS Community Builder (Cloud Operations)。前職はAWS Japan技術サポート。社内外を問わず開発者体験の向上に取り組んでいます