リファクタリング

Factoryによるクラス群の隠蔽

兆候

1つのパッケージ内にある共通のインタフェースを実装しているクラス群を、クライアントが直接インスタンス化 している。

before.jpg

処置

クラスのコンストラクタをパブリックでなくし、クライアントにはFactory経由でインスタンスを生成させる。

after.jpg

動機

クライアントが直接クラスをインスタンス化できて役立つのは、それらのクラスの存在そのものを知る必要が ある場合だけである。

「共通インタフェースを実装したインスタンスを生成して返す」という責務をFactoryに持たせることで、クライアントからパッケージ内のクラスを隠蔽することができる。 これによって、

  • クライアントが共通のインタフェースを通じてクラスとやりとりするようになる(インタフェースに対するプログラミング)。
  • パッケージ外に公開する必要のないクラスが隠蔽され、パッケージの「概念的重み」を減らすことができる。
  • Factoryに用意された意図の明確なCreation Methodを用いてインスタンスを生成することができる。

手順

  1. ある種類のインスタンスを生成するために、クラスのコンストラクタを呼び出している箇所を探す。
    • メソッドの抽出をコンストラクタの呼び出し部分に適応し、パブリックなstaticメソッドを作成する。
    • メソッドの移動 を適用して、選択したコンストラクタを持つスーパークラスに生成メソッドを移動する。
  2. 生成メソッドと同じ種類のインスタンスを生成するために、先に選択したコンストラクタを呼び出している部分をすべて洗い出し、生成メソッドを呼び出すように変更する。
  3. クラスのコンストラクタが生成するインスタンスの種類毎に、ステップ1,2を繰り返す
  4. クラスのコンストラクタをパブリック以外に変更する。
  5. カプセル化したいすべてのクラスについて、ステップ1〜4を繰り返す。

コメント

##comment_kcaptcha



添付ファイル: fileafter.jpg 1067件 [詳細] filebefore.jpg 1036件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-03-20 (土) 19:22:52 (5151d)
SmartDoc