春の入門連載の6日目です。
「リファクタリング」という言葉を聞いたことがある人は多いでしょう。「リファクタリング」という言葉は最初の書籍が出版されて、ここ22年ほどですっかり「一般名詞」として開発の中の活動として定着した印象があります。
リファクタリングは「コードの機能を変えずに、コードのメンテナンスがしやすいようにコードを整理する」活動です。リファクタリング本と相互に参考文献になっているエクストリームプログラミングの本では次のサイクルを繰り返すことで開発の生産性と品質を維持しながら開発をし続けることを提唱していました。
- テストコードを書く
- 機能を実装する
- リファクタリングをする
そのメンテナンスがしやすいコードの書き方のパートを集中的に紹介する書籍のリファクタリングですが、原著は1999年に初版が刊行されました。日本語訳も2000年に刊行されました。残念ながら、この時のバージョンは出版社がIT書籍から撤退ということで絶版になってしまいましたが、オーム社が引き継いで2019年には第2版の翻訳も出版されています。
僕も何度も読み込んで「良い設計をする」「良いコードを書く」というスキルアップに大いに影響を受けた本です。入門祭りということで、新しくなった第2版を改めて読んでみようと思います。
書籍の概要
この書籍はそこそこ厚みのある本(430ページ+目次と前書きで20ページ)ですが、エッセンスはとても薄くまとまっています。最初の5章はこんな感じです。
章 | タイトル | ページ数 | 内容 |
---|---|---|---|
1章 | リファクタリングー最初の例 | 44 | 読み物で、「リファクタリングをする人はこんな手順でやっているぞ」というロールプレイ |
2章 | リファクタリングの原則 | 28 | 一番大事! |
3章 | コードの不吉な臭い | 15 | 「世の中にはどのような悪い設計があるのか」というのがコンパクトにまとまっている |
4章 | テストの構築 | 17 | リファクタリングとともに行われるテストの紹介 |
5章 | カタログの紹介 | 3 | これから先の章のリファクタリングカタログを読むためのガイド |
最初の例は一度ざっと流し読みして雰囲気をつかむと、この後を読むのが楽になると思います。この時代の本にはこの手のロールプレイが良くついていた気がします。2版になってカラーになって見やすさが段違いに上がっています。また、このあとの章やカタログの章まで全部読んだあとに再度戻ってくると、自分の理解の補強や確認に役立つでしょう。
「リファクタリングの理論とエッセンスをつかむ」のであれば、2章を読むだけで十分です。ここは本気で読むと良いです。読書会をするとか、ちょっとできる人に教えてもらえる環境を作ってもいいと思います。28ページしかないので、すぐに読めると思います。
個人的には3章もお気に入りの章です。文法を学んで、なんとか動くものを作るぞ、という段階の人にはまだ良いコード、悪いコードというイメージがつきにくいかもしれませんが、この章を読むことでコードを見た時の選球眼を鍛えるきっかけになると思います。
あとの章はリファクタリング技法のカタログです。
カタログとコードの不吉な臭いから見えてくる良い設計
「良い設計」とか「悪いコード」って一言で言えるようなものではありません。同じ見た目のコードでも、変更頻度とか外的要因で悪くないコードだったりもします。それでも、長年の経験やら、変更のしにくさなど、さまざまな理由で、経験のある開発者は「よくない設計」を感じ取ります。
3章はアンチパターンから学ぶ良い設計のガイドです。昔はCプログラミング診断室という書籍もあり、このアプローチに感銘を受けましたが、いかんせんそちらの本は古すぎるし、今読むなら本書のリファクタリングの3章が良いですね。最初から良い設計でコードを書けることはほとんどなく、多くの場合は徐々に改善していってよいコードにしていくと思います。改善するには改善箇所を見つける必要があります。
例えば、「属性とgetとset以外に持たないクラス」を「データクラス」として不吉な臭いに挙げています。そして改善方法の1つとして、このデータクラスの値の変更をしている関数をメソッドとしてデータクラスに持ってくることを紹介しています。本来、適切に責務分割がされているのであれば、このようなコードにはならなかったはずですが、リファクタリングにより、ボトムアップで適切な責務が割り当てられて、良い設計が後から得られます。
リファクタリングというのは「ボトムアップの設計手法」であり、文法を学んで動くものが作れるようになった人が「設計を学ぶ」アプローチのひとつとしてとても優れていると思います。もちろん、トップダウンでオブジェクト指向な分析をしてコードを導いていくのも設計だと思いますし、概念設計でERDを書いてデータ構造を設計してテーブル設計をしていくアプローチもありますが、別に学ぶ方法は一本道ではないし、同時に学んでもいいわけで、その1つとしてもおすすめです。
カタログをよく見ると、A⇔Bみたいな対になっているものがあることに気づくでしょう。これも「良い設計」が状況次第である、ということの証左ですね。また、デザインパターンと呼ばれる設計カタログを導出するようなものもあります。デザインパターン入門の1つのきっかけになるポテンシャルもあります。
第2版の変更ポイント
初版と比べると、2版では主に2つの点が変更されています。
- カラーになってカタログに挿絵がついて見やすくなった
- 言語がJavaScriptになった
執筆時点のJavaScriptのバージョンにはなかったprivateの説明をするところだけはJavaになっていたりしますが、JavaScriptになったおかげで読みやすくなったという人も多いでしょう。とはいえ、言語の違いで伝える内容が変わるような本ではないし、JavaScript固有のリファクタリングのカタログとかはないので、一歩引いてそのエッセンスを実際に利用することになるでしょう。
例えば、今どきのウェブのフレームワークはクラスは使うことは減っています。VueもReactもクラスではない書き方が主流です。Angularとかlitは使いますが、ただこれらもコンポーネントとしての制約が大きくて、この本のクラスとは少し特性が違います。ただ、クラス間の責務の移動とかはコンポーネントからフック(React)とかサービス層とかへの移動とかに置き換えられるので、それぞれ使っているフレームワークにあわせて読み替えていく必要があります。
まとめ
2章と3章だけがポイントでこの程度のページ数なら本屋で立ち読みでも読み切ってしまえる分量ではありますが、後半のカタログ集を読めば読むほど理解が強調されていきますし、ぜひともじっくりカタログ部分も読んで、理解を深めていくのがおすすめです。
本書導入部にも書かれていますが、すっかり出版されてから業界に浸透し、各種IDEとかエディタとかでも機能として搭載されるようになったリファクタリングの原点を知ることで、良い設計に一歩近づけると思います。
この本は一度で完全に理解する必要はなく、読み手のレベルが上がってくると後半のカタログの「面白い!」と思う章が変わってくると思います。新卒入社でプログラミングを始めたばかり、という人でも、すぐに役に立つものもあれば、ちょっと大きめの設計をしてきて初めて「なるほど!」と思うものもあるかもしれません。また、そういう本であるので、読書会とかでちょっとできる先輩に行間とか事例とかを教えてもらいながら読むのも楽しい本だと思います。