リファクタリング
「リファクタリング」
プログラミングの体質改善テクニック
ピアソン・エデュケーション(2000)
ソフトウェア設計
マーチン・ファウラー
★★★★☆
原書の副題は「既存のコードのデザインを改善する」というものです。
リファクタリングの定義は、「外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変化させること」です。
多くの手法のカタログ的な構成になっていて、各手法は以下のような構成です。
(1)まず概要が簡単なコードの例やクラス図を使って説明されます。
(2)「動機」:なぜこのコードはリファクタリングされなければいけないのかが説明されます。ある種のアンチパターンのようなものです。
(3)「手順」:リファクタリング手順が詳細に示されます。少し修正して、少しテストというXPの見本のような手順がくどいほど繰り返されます。
(4)「例」:実際のコードの例が示されます。
デザインパターンもよく参照されますし、各手法も相互に関連していて、Javaの中級〜上級者向けの本だと思います。
得る所が大きいのは、まず、Javaで、こうコーディングしてはいけない、というアンチパターンと、それをリファクタリングした結果の、
こうあるべきだという常識が、コードのサンプルから学べるところです。その意味ではJavaのプログラム作法的な本でもあります。
読み方としては、プログラム作法の勉強のために精読するもよし、どんな手法があるのか、ざっと眺めた上で、リファクタリングが必要になったときに、必要な部分を精読するのもよいと思います。
「リファクタリングはなぜ有効か---Kent Beck
今できることを作り込めばそれで終わりと考えているのであれば、長くプログラマを続けていくことはできないでしょう。
今日はできたからといって、明日には通用しないかもしれないそのやり方を通せば、いつかは敗者となってしまいます。
重要なのは、今の時点で何が必要かが把握できても、明日については何もわからないということです。
多分こうだろうと推測しても、想像もしなかったことが起こるかもしれません。
今日については十分把握できますが、明日については不十分なままです。
しかし、今日のためにしか仕事をしないとすれば、やがて明日には何もできないことになるでしょう。
リファクタリングは、この苦境から抜け出すための手段です。
昨日の決定が、今日には意味を持たなくなったと気づいたならば、過去の決定を変更してしまえばいいのです。
そうすれば今日の仕事ができるようになります。
明日には、今日の理解が多少未熟だったと思うかもしれません。だったらまた変更すればいいのです。」
実際に中規模のリファクタリングをやってみた感想としては、リファクタリングとして、特別に作業を行うのではなく、
普段のプログラミングの一部として、少しづつ行うのが効果的であると思います。
ファウラーさんの本にも書いてあるのですが、大きなリファクタリングは、小さなリファクタリングを価値あるものとしている多くのメリットを欠いています。
(例えば、即座の満足、目に見える進捗)
実際、リファクタリング中の3日間は、外から見たら目に見える進捗は有りません。
しかし、その後のコーディングの進み具合には大いに貢献しましたし、コードレビューをやったのと同じ効果がありました。(バグもいくつか発見しました)
使ったのはTemplate Methodだったのですが、具体的な手順として、
(1)類似したコードから異なるコードを分離し、差異部分を抽出
(2)差異部分を同じシグニチャを持つメソッドを作成する
(3)メソッドの引き上げ
とあり、例題のコードを使って説明されていて、分かりやすいものでした。

