ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Type2 VS Type3

IoCコンテナを使うときには、コンポーネントのタイプを
Type2(プロパティベース)、Type3(コンストラクタベース)なのか
考える必要がありますが、どっちがいいのかは特に結論は出ていないんじゃ
ないかと思います。
正解かどうかは別にして、自分なりの結論が出たので書いてみたいと思います。
私の結論はType3です。
Type3にはつぎのようなメリット・デメリットがあると思ってます。
メリット

  • 余分なsetterメソッドが要らないので、状態を不用意に書き換えられる心配がない。
  • すべてのデータが設定された後に実行したいロジックを自然(コンストラクタの最後に実行する)に実装できる。SpringのようにafterPropertiesSetなどのメソッドをコンテナから呼び出してもらう必要がない。(コンテナに依存しない)

デメリット

  • コンストラクタの引数が増えると分かりにくくなり、継承したときも不便。
  • テストのときなどに特定のプロパティだけをセットするなんてことができない。
  • 循環参照ができない。

私は、コンテナで管理する業務ロジックコンポーネントは、
ステートレスなサービスだと考えているので、
それほど継承はないだろうと思ってます。
また、サービスは、他のサービスと依存関係は少なくなるように
設計するので、コンストラクタの引数がそれほど増えることはない
と考えています。
典型的なサービスは、DAOへの参照だけを持ち、
DAOはDataSourceへの参照だけを持っているような感じになるだろう
と思ってます。
テスト時の特定プロパティだけの設定の話も
他のコンポーネントとの依存関係がほとんどなければ問題になりません。
循環参照の問題については、循環参照が生じる場合は、
サービスの正規化に失敗しているのではないかと思います。
そのような場合は、互いに参照しているメソッドを別の共通サービスに
くくりだすなどの対応が必要になってくるのでしょう。
Type2だと循環参照があっても実装できてしまいますが、
Type3だとそもそも実装できないので、確実に気づくことができます。
Type3のほうが好ましいのは、あくまでもサービスコンポーネントと
DAOコンポーネントで、その他のコンポーネント、既存のコンポーネントなどは
都合の良いほうが構わないと思います。