はじめに
マルチスケールシミュレーション特論の講義メモです.講義メモのインデックスはコチラ
Refactoring Ruby
この記事はジェイ・フィールズ,シェーン・ハービー,マーティン・ファウラー 著 / 長尾高弘 訳 の 『リファクタリング:Rubyエディション』(アスキー・メディアワークス,2010年)に沿って refactoring を学んだ学習記録である.講義資料・コードは公開できないため,github の該当フォルダを参考にしていただきたい.
refactoring
講義内でも度々紹介されていたが, refactoring とは何か.再度確認する.
factoring には因数分解という意味があるが,プログラムを class や method に分割していくこと自体がプログラミングにおける因数分解と言えるだろう.re- がつくと振り返りや戻るというイメージになる.refactoring を簡単にいうと出来上がったプログラムを見直し,再度プログラムの構造を組み立て直すイメージになる.
厳密にいうと refactoring は 外部から見た動作を変えずに,プログラムの内部構造を組み立て直す
ということである.見た目を変えずに,中身を美しくしていく.人間もそうであるべき.
TSUTAYA Project
今回取り組んだのは リファクタリング:Rubyエディション の TSUTAYA Project (正式名称は不明,第 1 章 pp.25 ~ pp.74) である.ビデオのレンタル料金を計算して出力するプログラムで,様々な要素について複数のクラスに分けて表現されている.
編集の対象となるプログラムファイルは movie.rb, rental.rb, customer.rb の 3 つ.それぞれのプログラムにはプログラム名と同様のクラスが定義されており,
- Movie class: 作品のデータ(料金など)を表すクラス
- Rental class: レンタル情報(新作や子供料金など)を表すクラス
- Customer class: 顧客情報 (名前やレンタル作品) を表すクラス
のように構成されている.
はじめのプログラムは実行する上で特に問題はないのだが,プログラミングの書き方に問題があるらしい.冗長な部分を動作を変えずに改変していくのが refactoring の役目なので早速 refactoring していく.
手順としては一つずつ冗長な部分を直していき,テストしていく.プログラムを改変する際は一気に改変するのではなく,たとえ変数が一つ変えるだけだとしても少しずつ直してはテストをするように心がける.
修正すべき点としてあげられれているのは
- 長いメソッドは動作ごとに分割する.
- 各メソッドはそれぞれ適切なクラス下に定義する.
- 変更しやすいようにわかりやすい記述をする
これらの点を refactoring する.
refactoring の第一歩として, テストセットの作成 が重要視されている.テストセットを作成し,期待する出力と結果の出力は一致するのか・assert が出ていないか・どのようなエラーなのかまでしっかりわかるようにすることでバグに対する作業効率が向上する.講義内の assert_equal はここに結びつくわけか.
今回は rspec というテストセットを用いてrefactoring に取り組んだ.
さいごに
プログラムを追って説明することができないので,refactoring に取り組んでみて感じた感想について記述していく.
TSUTAYA Project の refactoring を終えるのに 3 時間近くかかった.単純計算でも 1 プログラム 1 時間くらい.今回は 3 つのプログラムの refactoring だったが,各プログラム間の相関なども考慮しながら進めるのでファイル数が増えれば指数関数的に時間もかかっていくだろう.
refactoring をしているこの感じどこかで味わったことがあるなと思ったが,それは Rails アプリケーションを作成するときの感じだった.複数のファイルを行き来し,この変数は instance 変数にした方が良いとか,この機能は別の class に移した方がいいとか,そういった考え方である.
個人的には refactoring 苦手,というか向いていない.飽き性なので同じプログラミングを睨めっこしたくない.機能追加するなら前のプログラムを踏襲して 1 から作り直したいし,より綺麗にしたい.瞬発力だけで動いていて持久力がない身からするとこの課題でさえも疲弊したのが本音である.
しかしながら改めて refactoring というものを学べる機会を設けていただいてよかった.より良いコードとは何か,より美しいコードとは何か.自分なりの答えを見つけられた気がする.
- source ~/grad_members_20f/members/e79a93e5b7b1/posts/class/refactoring_ruby.org