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」のままでも簡単にテストできる。「時刻ライブラリに介入」できるからだ。そういう言語なら、テストのためだけに(ですよね)コードを変形する必要はないんじゃないですかねえ。
AI・運用・OSS開発が好きなITエンジニア/共著『[入門]LLMアプリ開発』/AWS Community Builder (Cloud Operations)/ex-AWS