2009-07-03 24 views
0

私はアプリケーションを構築していますが、時間がたつにつれて起動時に初期化するオブジェクトがますます増えています。移動、いくつかの新しいオブジェクトは他のオブジェクトに依存しているので、オブジェクトが作成されてから別のコンストラクタに渡されるようなスパゲッティの初期化が行われています。私はそれが間違っていると思っています。起動時のオブジェクト初期化のパターン

たとえば、私は "コントローラ"クラスと2つのイベントを受け入れるWinFormを持っています。それは方法

Controller::SetDataGridReference(DataGridView^ dgv) 

を持っているように、コントローラは、WinフォームからのDataGridViewの存在を指示する必要があり、それぞれ別のものにそれらのオブジェクトを参照し、その後、起動時にオブジェクトをinstanciatingの一般的な方法はありますか?

必要なすべてのクラスをコンストラクタパラメータとして渡すことは良い方法ですが、率直に言って私はここでそれをどうやって行うことはできません。

私は本当にこれは、依存性注入(DI)を使用するための教科書のケースのように見える言語は

答えて

5

を重要とは思いません。確かにあなたのスパゲッティコードを助け、単体テストを助けることさえできます。 DIに向かって徐々に移行したい場合は、類似した関係を持つオブジェクトをリファクタリングし、すべての定型的なチェーンの初期化を処理できる数組のファクトリクラスを使用し、コードベースで行われるすべての箇所の集中化。

Google GuiceをJava用の優れたDIフレームワークとしてお勧めします。 Javaを使用していない場合でも、他の言語のDIフレームワークと比較するのに適したDIモデルです

1

コントローラデザインパターンを使用します。

つまり、コントローラと呼ばれるプログラムの初期化時にインスタンス化されるSINGLEクラスを作成します。そのクラスのコンストラクタで、他のすべてのオブジェクトを作成します。他のオブジェクトを必要とするオブジェクトは、そのオブジェクトをコンストラクタのパラメータとして受け取る必要があります。誰も、絶対に他のオブジェクトはコンストラクタ上に何も作成する必要はありません。すべてのものをコンストラクタのパラメータとして渡します。また、Controllerクラスのdestructor/disposeメソッドでは、すべてのオブジェクトdestructor/disposeメソッドを逆の順序で呼び出します。これによりコードが減少することはありませんが、後で理解してデバッグする方がはるかに優れています。

+0

これは、(http://java.sun.com/blueprints/patterns/FrontController.html)あなたが話すコントローラデザインパターンですか?それは私とは関係ないようです... – paxos1977

1

Dependency Injectionここで役立つはずです。アプリケーションの起動時に、オブジェクトのグラフの完全な(または並べ替え)を作成することができます。あなたのアプリケーションのエントリーポイントは、選択したDIコンテナをインスタンス化します。ルートオブジェクトを要求するだけです。

たとえば、Google Guiceには非常に素晴らしいObject grapherが付属しています。

2

2つのパターンがあなたの問題の詳細に依存する可能性がが適切として心にポップ:

  1. Abstract Factoryパターン。これは、@ Scanningcrewによって提案されたDependency Injectionアプローチの有無にかかわらず動作します。
  2. メディエーターパターン。メディエーターを作ろう。メディエータを各オブジェクトのコンストラクタに渡します。各オブジェクトをメディエーターに登録させる。その後、オブジェクトは明示的にお互いを知る必要はありません。これは、設定された数のオブジェクトが相互にやり取りしている場合にうまく機能します。
0

オブジェクトの相互作用については、私はMediatorに行きます。

"オブジェクトセットの相互作用をカプセル化するオブジェクトを定義します。メディエータは、オブジェクトが明示的に相互参照するのを防ぎ、緩やかな結合を促進し、相互作用を個別に変更することができます。

インスタンス化については、依存性注入を検討します。あなたの目標を達成するために、デザインパターンを自由に使用して混在させることができます。

関連する問題