プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

オブジェクト間での特性の移動

リファクタリング 7章

オブジェクト指向の設計では責任をどこに置くかで悩む。
リファクタリングによって以前の決定を変えられるので、悩みを軽減できる。

メソッドの移動

クラスの内部に他のクラスへの依存性が高いメソッドが存在する → メソッドを他のクラスに移動して、元のメソッドは委譲・または取り除く

  • 責任の集合を整理する
  • メソッドの参照している情報の割合が別のクラスに寄っていないか調べる。特にフィールドを移動した後
  • メソッドとのやり取りが多いオブジェクトを探す
  • 判断しにくい場合は直感で。後から変更できる。

フィールドの移動

あるクラスのフィールドが、現在または将来に渡って他のクラスで使われることのほうが多い → 他のクラスに移動

  • 他のクラスのほうが多くアクセスするなら移動する

クラスの抽出

2つのクラスでなされるべき作業を1つのクラスで行なっている → 分割して新しいクラスを作る

  • クラスは成長する。成長によって責任が増えると複雑になり手がつけにくくなる
  • 大きすぎて簡単に理解できないクラスは一部のデータとメソッドを新しいクラスへ切り分ける

クラスのインライン化

そのクラスは大したことをしていない → 別のクラスに特性を移動して削除

  • 「クラスの抽出」とは逆
  • リファクタリングで責任を移動した結果小さくなったクラスなどに適用する

委譲の隠蔽

クライアントがあるオブジェクトの委譲クラスをコールしている → サーバにメソッドを作って委譲を隠す

  • カプセル化によって情報を隠蔽することで変更を伝えるオブジェクトが少なくなり手を加えやすくなる

仲介人の除去

クラスがやっていることは単純な委譲 → クライアントに委譲オブジェクトを直接コールさせる

  • 「委譲の隠蔽」の逆。カプセル化はたしかに有効だが、新たな特性を使う度に委譲メソッドを追加する必要がある
  • 隠蔽のバランスをコントロールする

外部メソッドの導入

利用中のサーバクラスにメソッドを追加する必要があるが、そのクラスを変更できない → クライアントクラスにサーバクラスのインスタンスを第1引数にとるメソッドを作る

  • 別のクラスにメソッドを加えたいけど変更できない場合に、そのクラスを操作するメソッドを用意する
  • 大量の外部メソッドが作られたり、多くのクラスが同じ外部メソッドを必要とする場合は「局所的拡張の導入」を適用する

局所的拡張の導入

利用中のサーバクラスにメソッドを幾つか追加する必要があるが、クラスを変更できない → 追加されるメソッドを備えた新たなクラスを作成する。そのクラスは元のクラスのサブクラスまたはラッパー

  • 追加するメソッドが増えると「外部メソッドの導入」では対処しきれなくなる
  • サブタイプにすることで元クラスの特性を生かしつつ拡張できる

この記事で読み進めている本

リファクタリング―プログラムの体質改善テクニック (Object Technology Series)

リファクタリング―プログラムの体質改善テクニック (Object Technology Series)

  • 作者: マーチンファウラー,Martin Fowler,児玉公信,平澤章,友野晶夫,梅沢真史
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/05
  • メディア: 単行本
  • 購入: 93人 クリック: 3,054回
  • この商品を含むブログ (295件) を見る