Refactoring Kataを使ってRubyのリファクタリングを練習する
Refactoring Kata
CodeKataというサイトがありまして、これはプログラミングの練習をしたい人のための問題集です。この様な練習問題を総称して「Code Kata」あるいは「Coding Kata」と呼んでいます。Emily Bacheさんは、リファクタリングに焦点を絞ったCode Kataを公開していて、これらをRefactoring Kataと読んでいます。
Refactoring Kataは、非常に可読性の悪いコードに対して、新しい機能を追加するという課題になっていて、とても練習になります。もともと、こういう課題が無いかなぁと探していたのですが、とてもいいものが見つかりました。手始めに、Gilded RoseというKataに挑戦してみました。
Gilded Rose
こちらのKataのリファクタリングに挑戦します。
ファンタジーの世界の宿屋Gilded Roseで、商品の管理を行うプログラムに機能追加せよ、という課題です。仕様書の日本語版がついています。ありがとうございます!
コードを眺める
Rubyでやりたいので、'ruby/gilded_rose.rb'を眺めます。
ワーオ、これ、よく作れたなっていうレベルで難しいプログラムになってます。「リファクタリング」に照らし合わせて、どこにどのリファクタリングを適用すべきかを考えていくのも面白いかもしれません。
テストを書く
プログラムが非常に可読性が低いことがわかりましたが、以外にもちゃんと動きます。ということでテストを黙々と書いていきます。
リファクタリングする
テストが書けたらリファクタリングに取り組みます。
いろいろやりましたが、とにかく分岐を無くすこと、ネストを浅くすることを心がけました。 Qualityの更新に関するルールがわかるようになったのではないでしょうか。
OOPを駆使する
Itemクラスの変更が禁止されていたので、OOPはやらなくて良いかなーと思ったんですが、Adapterクラスを入れればできないこともないしなーとおもい、思いっきりOOPしてみました。
結果としては、個々のメソッドを単純にできたのですが、全体の構造は複雑になり、見通しが悪くなってしまった気がします。 Qualityをクラスにしたのはやりすぎだったように思います。
練習あるのみ
リファクタリングって、かなり時間のかかる行為だと思っています。実際、今回はトータル3時間くらいコードを触っていました。ただ、それも慣れの問題が大きいと感じていて、こういった教材を使って経験を積んでいくことにより、短時間でリファクタリングすることは十分可能なはずです。
Refactoring Kataを使って日々鍛錬をしていきましょう。