マイペースなRailsおじさん

Ruby、Ruby on Rails、オブジェクト指向設計を主なテーマとして扱います。だんだん大きくなっていくRuby on Rails製プロダクトのメンテナンス性を損なわない方法を考えたり考えなかったりしている人のブログです。

Refactoring Kataを使ってRubyのリファクタリングを練習する

Refactoring Kata

CodeKataというサイトがありまして、これはプログラミングの練習をしたい人のための問題集です。この様な練習問題を総称して「Code Kata」あるいは「Coding Kata」と呼んでいます。Emily Bacheさんは、リファクタリングに焦点を絞ったCode Kataを公開していて、これらをRefactoring Kataと読んでいます。

Refactoring Kataは、非常に可読性の悪いコードに対して、新しい機能を追加するという課題になっていて、とても練習になります。もともと、こういう課題が無いかなぁと探していたのですが、とてもいいものが見つかりました。手始めに、Gilded RoseというKataに挑戦してみました。

Gilded Rose

こちらのKataのリファクタリングに挑戦します。

github.com

ファンタジーの世界の宿屋Gilded Roseで、商品の管理を行うプログラムに機能追加せよ、という課題です。仕様書の日本語版がついています。ありがとうございます!

GildedRose-Refactoring-Kata/GildedRoseRequirements_jp.md at master · emilybache/GildedRose-Refactoring-Kata · GitHub

コードを眺める

Rubyでやりたいので、'ruby/gilded_rose.rb'を眺めます。

GildedRose-Refactoring-Kata/gilded_rose.rb at master · emilybache/GildedRose-Refactoring-Kata · GitHub

ワーオ、これ、よく作れたなっていうレベルで難しいプログラムになってます。「リファクタリング」に照らし合わせて、どこにどのリファクタリングを適用すべきかを考えていくのも面白いかもしれません。

テストを書く

プログラムが非常に可読性が低いことがわかりましたが、以外にもちゃんと動きます。ということでテストを黙々と書いていきます。

リファクタリングする

テストが書けたらリファクタリングに取り組みます。

いろいろやりましたが、とにかく分岐を無くすこと、ネストを浅くすることを心がけました。 Qualityの更新に関するルールがわかるようになったのではないでしょうか。

gist.github.com

OOPを駆使する

Itemクラスの変更が禁止されていたので、OOPはやらなくて良いかなーと思ったんですが、Adapterクラスを入れればできないこともないしなーとおもい、思いっきりOOPしてみました。

結果としては、個々のメソッドを単純にできたのですが、全体の構造は複雑になり、見通しが悪くなってしまった気がします。 Qualityをクラスにしたのはやりすぎだったように思います。

gist.github.com

練習あるのみ

リファクタリングって、かなり時間のかかる行為だと思っています。実際、今回はトータル3時間くらいコードを触っていました。ただ、それも慣れの問題が大きいと感じていて、こういった教材を使って経験を積んでいくことにより、短時間でリファクタリングすることは十分可能なはずです。

Refactoring Kataを使って日々鍛錬をしていきましょう。