LoginSignup
2
0

More than 5 years have passed since last update.

マーティン・ファウラーのリファクタリング 個人的まとめ(第6・7章)

Last updated at Posted at 2017-04-06

新装版 リファクタリング ~既存のコードを安全に改善する~

  • 読みました。
  • 忘れないうちに、それぞれの手法について一言くらいでメモしていきます。
新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES) 新装版 リファクタリング―既存のコードを安全に改善する― (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 サブクラス で対応する
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0