新装版 リファクタリング ~既存のコードを安全に改善する~
- 読みました。
- 忘れないうちに、それぞれの手法について一言くらいでメモしていきます。
新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES) Martin Fowler 児玉 公信 オーム社 2014-07-26 売り上げランキング : 22428 Amazonで詳しく見る by G-Tools |
第6章 メソッドの構成
メソッドの抽出
- ひとつの目的を達成するための、ひとまとまりのコードを括りだす
- 空白行で区切って、空白行でまとめるくらいなら、意味のある名前をつけたメソッドに抽出する
メソッドのインライン化 / 一時変数のインライン化
- 一時変数に入れるまでもない、メソッドとして括るまでもない単純な処理は元に戻す
問い合わせによる一時変数の置き換え
- ×一時変数に保持して呼ぶ
- ◯メソッドで毎回計算する
- 一時変数のスコープを狭めるのに有効
- メソッドであれば、オブジェクトのどの箇所からでも同じ値が使用できる
- リファクタではパフォーマンスは一旦気にしない(わかりやすくしてから、ボトルネックを最適化する)
説明用変数の導入
- 一見して計算結果が分からないような式に名前をつける
- 特に条件判定部分で有効
-
isContained
とかisValid
とか
パラメータへの代入の除去
- 入力引数への代入、置き換えはしない
void someMethod(Object foo) {
foo.someMethod(); // OK
foo = bar; // NG
}
メソッドオブジェクトによるメソッドの置き換え
- あるメソッドだけを持つクラスを作り、実行を委譲する
- 一時変数をフィールドに昇格させる
- リファクタの途中でほぐしていく段階で使用する
アルゴリズムの取り替え
- 同じことを達成できるならできるだけ簡単で分かりやすいアルゴリズムを使う
第7章 オブジェクト間での特性の移動
メソッドの移動
- 自分のフィールドではなく、他オブジェクトのフィールドを頻繁に参照するメソッドは、そのオブジェクトに移動する
フィールドの移動
- 自分のメソッドではなく、他オブジェクトのメソッドから頻繁に参照されるフィールドは、そのオブジェクトに移動する
クラスの抽出 / クラスのインライン化
- 単一責任出ない場合はクラスを分割
- 同じ責任を分担してやっているクラスや、大したことやってないクラスは統合
委譲の隠蔽 / 仲介人の除去
- あるクラスが保持するクラスのメソッドを直接呼び出しているときは、適切に委譲メソッドを作成し、依存関係を整理する
- 委譲先のメソッドが多い場合などは、委譲のためだけに仲介クラスに大量メソッドを書かないといけないので直接呼ぶようにする
外部メソッドの導入
- 外部ライブラリ等、変更できないクラスを拡張する場合
- そのクラスを第一引数にしたメソッドを作成する
public void someMethod(Object someObj, int param, int param2) {
// 何か処理
}
局所的拡張の導入
- 外部メソッドが多くなった場合
- ラッパークラス or サブクラス で対応する