「リファクタリング 既存のコードを安全に改善する」を読んだ

リファクタリングについては Java言語で学ぶリファクタリング入門 を必要な時に必要なとこだけパラパラと読んだだけ、という感じだったのだけど、ふと、ちゃんと一冊何か読みたいなと思っていたので読んだ。選んだ理由は特になくて、前から知っていたというのと、借りられる状態だったのでちょうど良さそう、みたいな結構軽い気持ちで読み始めた。

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

第1章~第4章

この本には、まず「リファクタリングとは何か」とか「いつ、なぜリファクタリングをするのか」みたいなことが書かれている。特に第三章の「コードの不吉な臭い」という章は導入部としては一番重要な章で、「どういうコードを見たらリファクタリングしないといけないか」ということを「不吉な臭い」という表現で表していて、具体的にどういう臭いがあるかがパターンに分けられてそれぞれ名前が付けられている。名前が付いてるのはとても良くて、「ああこういう時はマズイんだな」というのが雰囲気で伝わってくる。 わかりにくいやつもあって、例えば「特性の横恋慕」みたいなのはそのワードを見ただけでは正直よくわからない。そういうのにも「どういうコードか」ということと「こうやって直していくとよい」という方針がその後のページのリファクタリングカタログへのポインタと共に書かれているのできちんと理解できるようになっている。

第5章~第12章

第5章からはしばらく「リファクタリング・カタログ」が続く。リファクタリング・カタログというだけあって、リファクタリングの内容にそれぞれ名前がついている。各項目は決まったフォーマットで書かれていて、そこだけ開いて読んでもわかるようになっている。サンプルコードはJavaではあるのだけど、作業手順が丁寧に書かれていてわかりやすい。サンプルコードはJavaだけど、他の言語にもそんなに難しくなく応用できると思う(もちろん個々の事情の違いはあるとは思うけど)。

第13章~第15章

残りの章は著者であるMartin Fowler以外の寄稿となっている。実際にリファクタリングを伝えて行こうとした話や、リファクタリングをする時に考える必要があることとかが書かれている。この部分は実例に沿って書かれている部分が多いため、自分で実際にリファクタリングを進めようとする時に参考になると思う。とはいえこれを書いている時点でこの実例に沿うような事態になっていないので推測だけど。 第15章の「部品から全体へ」にはリファクタリングを進めることだけではなく、リファクタリングを進めずに戻ることについても触れられている。リファクタリングをやめることについても書かれている。ちょっと感情寄りな話が多いような気もするけど、書かれていることについては意識しておいたほうがよさそうだな、と思う。

全体を通して

「はじめに」にこの本をどうやって読んだらいいか、というのが書かれていたけど、僕は一旦全体をざっと読んだ。「コードの臭い」や「リファクタリング・カタログ」の部分についても、まず読まないと後で参照できなくなると考えたのでまず通して読むようにした。 コードの臭いに書かれた部分やリファクタリング・カタログについては、例えば「長すぎるパラメータリスト」は結構意識しているし、「メソッドの抽出」とか「条件記述の単純化」についても意識している。なので実際にリファクタリングする時だけじゃなくて、最初からコードを書くような場合についても役立つ考え方だと思う。

簡単な修正に関してはそんなに難しくないのだろうけど、少し大きめのリファクタリングをする時にはある程度設計の知識も必要になると思う。例えば「巨大なクラス」みたいに、「これはちょっと大きくなりすぎているな」という時に後のことを考えつつ分解していくのは、当然ではあるけどリファクタリングの知識だけだと難しい。何の知識もないまま分解すると結局よくわからないものが出来上がりそう。

リファクタリングに慣れるためには、既存のコードを少しづつ修正していくというやり方しか無いと思う。最初に書いたコードが最高な状態になっていることはほとんど無くて、少しづつの修正を繰り返して洗練していく必要がある。仮に最初から最高の状態だったとしても、コード外の環境の変化(仕様変更とか最初の想定からのズレとか)によって最高の状態でなくなることがあるので、 リファクタリングに関する勉強をしておくのは良いことだと思う。 リファクタリング作業を進める時に、カタログを何度も参照することになりそう。何度も読んだほうがよさそうな本だと思うし、合わせて設計の勉強もしないと、この本に書かれている内容を完全に実践することはできないと思う。設計の勉強も進めていきたい。