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