「Refactoring(第 2 版)」の変更点

「Refactoring」の第 1 版と第 2 版の主な変更点の要約

2018 年 9 月 5 日

第 2 版の構造は、第 1 版と同じです。第 1 版は非常に成功したので、実績のあるものを継続するのは当然です。

第 1 版は 4 つの解説章で始まり、これらは第 2 版にもすべてあります。これらはすべて、オリジナルの本の一般的な形式に従っています。

最初にビデオレンタル店の例がなくなりました。ビデオレンタル店はお馴染みではなくなったからです。リファクタリングの流れはほとんど同じです。関数の分割、フォーマット計算の分離、多相性を使用した分類ごとの計算の整理です。

原則と問題点の章は、両方とも徹底的に見直しました。そのまま残した部分もあれば、大幅に変更された部分もあります。3/4 程度が変更されたと思います。ただし、これは実際的な測定ではなく直感に基づいています。テストの章は、Java から JavaScript に変更されたため、完全に作り直す必要がありました。

これらの序章の後に、私は常にこの本の核心であるカタログを続けます。カタログの変更点については後で詳しく説明しますが、注目すべき構造上の変更点が 1 つあります。最初に学習すべき基本的なリファクタリングの方法をまとめた章を作成しました。

より間接的な問題を調査した後続の章は削除しました。それらは第 1 版では機能したと思いますが、今はそのようなエッセイを自身のウェブサイトで公開する方が良いと思います。カタログから「大規模リファクタリング」の 4 つを削除したのも同じ理由です。大規模リファクタリングは常に大多数のリファクタリングとは少し異なっており、これらの例は自身のウェブサイトのエッセイでより効果的だと思います。

カタログの変更点

ではカタログで何が起こったのか? 次の表は、元の 68 のリファクタリングの状況を示しています。 [1]

初版のリファクタリングの状況
ページ状況置換
パラメーターの追加275置換➜ 関数宣言の変更
双方向の関連付けを一方向に変更200廃止
参照の値への変更183保持
一方向の関連付けを双方向に変更197廃止
値から参照への変更179保持
階層の縮小344保持
条件式の統合240保持
重複条件フラグメントの統合243置換➜ ステートメントのスライド
条件の分解238保持
観測データの重複189廃止
コレクションのカプセル化208保持
ダウンキャストのカプセル化308廃止
フィールドのカプセル化206置換➜ 変数のカプセル化
クラスの抽出149保持
インターフェイスの抽出341廃止
メソッドの抽出110置換➜ 関数の抽出
サブクラスの抽出330置換➜ 型コードをサブクラスに置き換え
スーパークラスの抽出336保持
変数の抽出124保持
テンプレートメソッドの形成345廃止
デリゲートを削除157保持
メソッドを削除303廃止
インライン·クラス154保持
インライン·メソッド117置換➜ インライン·関数を追加
インライン·一時変数119置換➜ インライン変数を追加
アサーションを導入267保持
外部メソッドを導入162廃止
ローカル拡張を導入164廃止
Null オブジェクトを導入260置換➜ 特殊例を導入
パラメーターオブジェクトを導入295保持
フィールドを移動146保持
メソッドを移動142置換➜ 関数を移動
メソッドをパラメーター化する283置換➜ 関数をパラメーター化する
オブジェクト全体を保持288保持
コンストラクタ本体を上に移動325保持
フィールドを上に移動320保持
メソッドを上に移動322保持
フィールドを下に移動329保持
メソッドを下に移動328保持
パラメーターへの代入を削除131置換➜ 変数を分割
制御フラグを削除245置換†➜ 制御フラグを中断で置換
ミドルマンを削除160保持
パラメーターを削除277置換➜ 関数宣言の変更
設定メソッドを削除300保持
メソッドの名前を変更273置換➜ 関数宣言の変更
配列をオブジェクトで置換186廃止
条件文を多態性で置換255保持
コンストラクタをファクトリメソッドで置換304置換➜ コンストラクタをファクトリ関数で置換
データ値をオブジェクトで置換175置換➜ プリミティブをオブジェクトで置換
委任を継承で置換355廃止
エラーコードを例外で置換310保持†
例外をテストで置換315置換†➜ 例外を事前チェックで置換
継承を委任で置換352置換➜ スーパー·クラスをデリゲートで置換
マジックナンバーをシンボリック定数で置換204置換†➜ マジックリテラルを置換
メソッドをメソッドオブジェクトで置換135置換➜ 関数をコマンドで置換
ネストされた条件文をガード条項で置換250保持
パラメーターを明示的なメソッドで置換285置換➜ フラグ引数を削除
パラメーターをメソッドで置換292置換➜ パラメーターをクエリで置換
レコードをデータクラスで置換217置換➜ レコードをカプセル化
サブクラスをフィールドで置換232置換➜ サブクラスを削除
一時変数をクエリで置換120保持
型コードをクラスで置換218置換➜ プリミティブをオブジェクトで置換
型コードを状態/戦略で置換227置換➜ 型コードをサブクラスに置き換え
型コードをサブクラスで置換223保持
フィールドをセルフカプセル化171置換➜ 変数のカプセル化
クエリを修飾子から分離279保持
一時変数を分割128置換➜ 変数を分割
アルゴリズムを代用139保持

† Web 版のみ

保持とマークされたリファクタリングは、2 番目の版で同じ名前の下に示されています。不在とマークされたものは、新しい版にはありません。新しい版からリファクタリングを削除した理由はいくつかあります。将来的にはこの記事を拡張して、そのいくつかについて説明するかもしれません。 replaced とマークされたリファクタリングは、新しい版で名前が異なるリファクタリングがあります。それらのいくつかは「一時変数を分割」を「変数を分割」に変更するなど、名前を変更しただけのもので、ほとんどが「メソッドを取り出す」を「関数を取り出す」に変更するなど、ささいな一般化です。これらの一般化の多くは、書き換えのオブジェクト中心でない性質を反映しています。場合によっては、最初の版のリファクタリングがいくつか組み合わされています。たとえば、[パラメーターの追加、パラメーターの削除、メソッド名の変更] はすべて [関数の宣言の変更] に置き換わっています。取り残したものと同様に、将来この記事を拡張して個々の事例について説明するかもしれません。[2]

新しい版には、15 個のまったく新しいリファクタリングが含まれています。つまり、既存のリファクタリングの一般化や名前変更ではありません。これらは次のとおりです

関数をクラスに結合
関数を変換に結合
ステートメントを関数に移動
呼び出し側にステートメントを移動する
未使用のコードを削除する
フィールドの名前を変更する
変数の名前を変更する
コマンドを関数に置き換える
派生変数をクエリに置き換える
インラインコードを関数呼び出しに置き換える
ループをパイプラインに置き換える
クエリをパラメータに置き換える
サブクラスをデリゲートに置き換える
返却する値を変更する
フェーズを分割する

名前だけでは、これらの新しいリファクタリングが何をし、一般化されたリファクタリングが初版の内容とどのように異なるかを十分に伝えることができないことを理解しています。時が来たら、オンラインカタログを更新して、さらに詳しい情報を提供します。


脚注

1: 68には、オリジナルの書籍からの4つの「大きなリファクタリング」は含まれていません。前に述べたように、このようなテーマはWebで公開できるエッセイとして最も適切に表現できると私は考えています。

2: そうするかどうかは、読者に興味があるかどうか、そして今後数ヶ月に書きたい他の内容に対して、これをどのように優先するかによって異なります。