リファクタリング関係の書籍。少し前の業務で結構な時間を(未熟な自己流の)リファクタリングに費やしたことがあったので、その反省も兼ねて読み漁っていました。今思い起こすと、再発明的なことをたくさんしていたように思います。先に知っていれば。
整理目的で、リファクタリングに対する現時点の理解を書き残しておきます。
Java言語で学ぶリファクタリング入門 / 結城浩
使用頻度の高いであろうリファクタリング技法について、それぞれかなりページ数を割いて説明しています。紹介する数よりも、説明の濃さに重点を置いた本。よく見かけそうで、しかもやろうと思えばすぐ適用出来そうな技法が選ばれています。
- シンボリック定数によるマジックナンバーの置き換え
- 制御フラグの削除
- アサーションの導入
- ヌルオブジェクトの導入
- メソッドの抽出
- クラスの抽出
- クラスによるタイプコードの置き換え
- サブクラスによるタイプコードの置き換え
- State/Strategyによるタイプコードの置き換え
- 例外によるエラーコードの置き換え
- Factory Methodによるコンストラクタの置き換え
- 観察されるデータの複製
- 委譲による継承の置き換え
- 委譲の隠蔽
- 継承の分割
各章が20ページ前後の容量であり、章末には練習問題。トレードオフの説明に分量を割いているのが印象的で、初めてリファクタリングという開発技法および思想に触れる人に向いていそうです。リファクタリングは技法よりもまず、思想(意義や用途の理解)を取り入れないことには始まらないので。
紹介されている技法の数は少ないですが、それはリファクタリングに価値を感じたら、つまりこの本の内容を理解できたなら、他の本を読んでカバーすることになります。
リファクタリング―プログラムの体質改善テクニック / マーチン・ファウラー
序盤でリファクタリングの意義・基本的なやり方・適用場面等、リファクタリング全般に対する姿勢を語り、中盤移行はひたすらリファクタリング技法の紹介。ファウラーさんといえば難解なアナリシスパターン本を思い浮かべてしまいますが、この本は非常に分かりやすいです。コワクナイヨー
それなりに古い本であることは、頭の隅に置いて読む必要があります。本文で用いられている言語はJavaだけども、ジェネリクスなどないJavaです。いまどきのJava、あるいはいまどきの別の言語では、もっと洗練された技法が存在することもあるので。
序盤にあるリファクタリングの意義というのは例えば、以下のようなモチベーションです。
- ユーザーが望む変更を気軽にコードに反映させるわけにはいかないとなると、結局困るのは開発者であるあなたです。
- まず機能追加が簡単になるようにリファクタリングをしてから追加を行うこと。
- 昨日の決定が、今日には意味がなくなったと気づいたならば、過去の決定を変更してしまえばよい。
- 明日には通用しないかもしれないやり方を通せば、いつか敗者になってしまう。
- コンパイルに余分なCPUサイクルをちょっと使っても問題にならないが、コード修正に一週間余計にかかれば問題
リファクタリングって意味あんの?という段階を超えるのが最重要課題なので、前半が大事なところなのだと思います。
ところで、文中にはコード例がたくさん出てきますが、これが可能な限りページを跨がないように徹底されています。わかりやすい。そうするためにあっさりと改ページするため、章末でないのにスカスカなページも結構あります。とてもリファクタリング本らしさを感じるところ。
コンパイラが理解できるコードは誰にでも書ける。すぐれたプログラマは、人間にとってわかりやすいコードを書く。
パターン指向リファクタリング入門 / ジョシュア・ケリーエブスキー
構成はファウラー本と同様に、序盤で思想的なところ、中盤以降に技法紹介です。文中でファウラー本のリファクタリング技法名称を頻繁に引用していますが、読んでいなくても大した問題ではありませんでした。小さいレベルのリファクタリングは技法的には難しいことはないし、ぐぐれば何かしら解説が出てくるので。自分はこれをファウラー本よりも先に読みました。
前半のモチベーション部分では、ファウラー本と似たような話の他には、デザインパターンとリファクタリングの関係について1章が割り当てられています。ファウラー本の「パターンは目指そうとするところ、リファクタリングはどこか別のところからそこへ到達する方法」というくだりを引用した上で、そのあたりを少し詳しく説明してありました。
「パターン魔(pattern happy)」についての言及もあります。紹介されていたパターン魔のサンプルはこちら。
ベタ書きでも十分わかりやすいところにデザインパターン導入するとかバカじゃねーの?って話。この方向で貶されている場面って、あまり目にしませんね。
技法の紹介部分では書名の通り、既存のコードにデザインパターンを適用していくサンプルが並べられています。第5章のタイトル「パターンを取り入れるリファクタリングのカタログ」が表す通り。
読んだ3冊の比較
結城さんの本は明らかに入門本です。パターン指向~も書名に入門と付いていますが、ファウラー本と同程度のレベルでしょう。これら2冊は、デザインパターンがだいたい理解できる程度の理解は必要です。パターンを理解していないと、なんでそんな風に直すの?という疑問に負けてしまうので。
技術レベルだけ見れば、デザインパターンが大体わかる程度というのも、そんなに高い要求ではないでしょう。しかし、リファクタリングの意義なり目的を理解しないまま本文を読み進めると、「微妙な技法がたくさん載っている退屈な本だったな」で終わってしまうかもしれません。書いてある手順は余裕で理解できるけれども身に付かず忘れてしまう、あるいは読むのに飽きるのではないかと思います。
コードを修正したり機能追加したりという方向の経験を積んでいて、「ああー同じようなこと○○のときにやったな…」と実感するところがあれば、受け入れやすいのでしょうが、これらは一口にコーディング歴では表せないところ。もし有難味を感じられないのなら、コーディング経験が十分だとしても、結城さんの入門書から読んだ方がいいかもしれません。
ファウラー本とパターン指向~の比較では、後者の方がよりモチベーションが伝わりやすいように思います。著者の知名度は低いですが、出た時期が5年ほど違っていて、ファウラー本以外にも色々と参照した上で整理されています。自分がリファクタリングの意義をそれなりに理解できたのは、この本でパターンとリファクタリングの立ち位置の説明がなされていたからです。また、パターンを導入するような例を示されると現実味があって、リファクタリング何それ?程度の人間が思考を転換するには良かったのかもしれません。
パターン指向~の邦訳本はあまり売れていないのか、ちょっと入手性に難がありそうなのが気になりますが…。
リファクタリングの立ち位置を考える
パターンは目指そうとするところ、リファクタリングはどこか別のところからそこへ到達する方法
二度目の引用。どこか別のところは、最初は無であり、そこから完成形にまっすぐ進んで終了できるならば幸せです。それが夢物語でまっすぐウォーターフォール出来ないことは明らか。目的地点が変わってしまうことは普通であり、その目的変更を取り入れないとひどいソフトウェアが出来るというのも、やはり当然のことです。
そこで出てくるのが、リファクタリングであると。
- パターンへの理解により、目的達成のための設計能力を得る
- リファクタリングがわからないと、方針変更に弱い
- リファクタリングへの理解により、正しい目的地への移動能力を得る
- パターンの知識が少ないと、進む方向がわからない
こんな感じで相補関係にありそうです。
ファウラー本の目次を眺めているだけでもわかる通り、リファクタリングには真逆の技法がたくさんあります。「サブクラスの抽出」と「階層の平坦化」など。パターン魔の例で示されるように、過ぎたるは及ばざるがごとし、という考えが前提のひとつとしてあると思います。無用な拡張性は悪であり、予想外のところで拡張が必要になったならば、そこで設計を変えていく、と。
テストとの関連性
リファクタリングの意義がわかって、ようやくテストの価値や方向性も感じられるようになってきました。仕様を定義したテストを書いて、それを満たすように設計をしよう!というだけでは、テストが意味ないとは言わないけれども、こんな分かりきったテストを書いてもな…と考えてしまう部分が大きかったのです。
中身を入れ替えるようになると、細かいステップで足元を確かめながら進める有難味を非常に感じます。逆に、もう二度といじらないところや、細粒度すぎて内部実装の変更時に使わなくなるレベルまで、こまごまとテストを書く意味は薄いですね。
総括
リファクタリング、もっと早く読んで知っておけばよい技術でしたが、これまできっかけがありませんでした。ソースコードの修正する人が読む?みたいなイメージがありましたが、ソフトウェア開発全般に有用な技術でした。
サンプルがJavaな本ばかりですが、難しいJava特有の技などは出てこないので、Javaあまり知らないとかJava嫌いとかで避けてしまうのは、勿体なさすぎます。(自分も若干そんな事考えていました)
0 件のコメント:
コメントを投稿