Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

書籍 Refactoring to Patterns | Generalization | Replace One/Many Distinction with Composite

パンくず

書籍 Patterns to Patterns
Generalization
Replace One/Many Distinction with Composite

概要

Replace One/Many Distinction with Compositeリファクタリングについて

使用する場面

あるクラスがひとつのオブジェクトと多数のオブジェクトを扱うメソッドを別々に持っている時。

対応方法

Compositeパターンを適用する

利点と欠点

利点

・ひとつのオブジェクトと多数のオブジェクトのハンドリングよる重複を削除する
・ひとつのオブジェクトと多数のオブジェクト対して統一された方法を提供する
・多くのオブジェクトによりリッチな方法を提供する

欠点

Compositeの構築時にタイプセーフかどうか確認が必要

手順

定義

one-object methodはひとつのオブジェクトを呼ぶメソッド
many-object method は多数のオブジェクトを呼ぶメソッド

1. many-object method はパラメータをコレクションとして扱う。
コンストラクタに、リストを受け取るクラスを新たに作成する。
このCompositeクラスはデザインパターンCompositeになる。
many-object method はあらたなCompositeクラスで宣言され、インスタンス化される。
さらに、many-object method を呼び出している箇所を調べ呼び出しを置き換えます。

2.メソッドの抽出を適用し、publicメソッドにする。
メソッドの移動で many-object method を移動する。

3. many-object method は one-object methodと区別されている。
この差は many-object method はCompositeであること。
もし、他に違いがあればリファクタリングでそれらを排除する。

4. one-object methodと many-object method に共通のインターフェースを作成する

5. 一行だけになったmany-object method をインライン化する。

6.コレクションのカプセル化Compositeに行う。addメソッドを追加する

サンプル

サンプルはGoFデザインパターンCompositeパターン