2009-06-12 2 views
40

Context design patternについて読んだことがあります。ここで私は、テキストからわかるものです:コンテキストデザインパターンについて説明できますか?

  • あなたはあなたにすべての変数を送信する必要がないように、あなたは、それを必要とする誰にそれを周りに渡すすべての変数

  • を含むマップを持っていますメソッドパラメータ

私はそれを取得しましたか?

+0

も参照してください:[コンテキストオブジェクトデザインパターンとは何ですか?](http://stackoverflow.com/questions/771983/what-is-context-object-design-pattern) – emallove

+0

@ glen-best answerは(63対7票)。 –

答えて

18

コンテキストオブジェクトは、共有データおよび機能へのアクセスを提供します。あなたは現実世界の例をしたい場合は

  • グローバル
  • シングルトン
  • 長いパラメータリスト

The ACCU provides a more detailed description.

:それはのためのエレガントかつ柔軟な代替することができ

Javaのコンテキストパターンのうち、を確認してください。

コンテキストパターンを使用する場合は、dependency graphを気にする必要があります。 (これがKpatajnKoldがそれを反パターンと呼ぶ理由です)。

不要な依存関係を制限するには、異なる目的で異なるコンテキストを使用します。コンテキストを可能な限りシンプルに保ち、構成や継承を使用して必要に応じて複雑性を追加します。

64

私はそれを取得しましたか?

申し訳ありませんが、かなりです。

Context Objectの目的は、暗黙のうちに強いタイピングとカプセル化を回避する手段として、多くのパラメータを暗黙的にメソッドに渡すことであるではありません。です。目標は、プロトコルおよびプレゼンテーション技術とは無関係に、一般的な、しかし管理された方法でスコープされたデータを格納することです。スコープ内に格納されたデータは本質的に共有され、構造化され、本質的にメソッドに渡される一回限りのパラメータとは異なります。

コンテキストオブジェクトパターンは、Core J2EE Patterns 2nd Edに初めて導入されました。 「コンテキスト」部分は、オブジェクトがの範囲内のデータを保持するという事実を指す。
(例えば、application/session/request/conversation/flash)。

HttpSessionおよびHttpRequestのようなプロトコル/プレゼンテーションテクノロジー固有のクラスからアプリケーションデータとロジックを可能な限り切り離すことが目的です。コンテキスト・オブジェクトの下

パターンの実装

、アプリケーション/セッション/リクエスト/その他の範囲を対象としたデータは、他のServletContext/HttpSession/HttpRequest /プロトコル固有のクラスに直接置かれていません。代わりに、データはPOJOラッパークラスに格納され、ServletRequest/HttpSession/HttpRequest /その他に格納されます。

コンテキストオブジェクトは、マップにデータを格納しますが、プログラムに関連する任意の構造体/形式のデータを格納する必要はありません。

アプリケーションは、スコープごとに1つのContext Objectクラスを使用することができます。また、クラスの拡張を避け、懸念の分離を促進するために、データを規則的に分割する複数のクラスが使用できます。

コンテキストオブジェクトは、最前面のプレゼンテーションクラス(ビュー、フロントコントローラ、ディスパッチャ)によって使用されます。これらのプレゼンテーションクライアントオブジェクトは、スコープ付きコンテキストデータを格納するためにcontextObject.getを呼び出し、スコープ付きコンテキストデータを格納するためにcontextObject.putを呼び出します。

ビジネス/統合ロジックには渡されません。それは厳しいタイピングを迂回して多数のパラメータをビジネスオブジェクトに渡す手段としては使用されません。ビジネス・インテグレーション層には、ビジネス・デリゲート、アプリケーション・サービス&、または特定の厳密な型指定パラメータを使用するセッション・ファサードがあります。コア:そのようServletContextHttpRequest

  • 柔軟性&再利用性など、単純なPOJOではなく、プロトコル固有の複雑なサーバークラスをモックする必要があるユニットテスト、:

    パターンは

    • テスト容易性の利点は、プロトコルの薄いプロトコルの「プレゼンテーション」レイヤーとは独立して動作します。つまり、アプリケーションはプロトコルやプレゼンテーション技術(HTML/HTTP /サーブレット、WAP /サーブレット、XML/SOAP/HTTP/EJB、HTML/HTTP/JSFなど)をより簡単に変更または追加できます。

    コメント

    • は歴史的パターンである
    • 一つのそのようなCDI、Guiceの、春、シーム、既にプロトコルで実装&他与える範囲ストレージとしてその依存性注入フレームワークを主張することができ独立した方法。つまり、すべてのスコープが既にコンテキストオブジェクトとして実装されているため、開発者は追加のコンテキストオブジェクトを作成する必要がありません。これはパターンを否定しません。つまり、CDIフレームワークが既にパターンをサポートしています。
    • 正しく実装した場合、1は、で終わることができ、「周りを通過Ginormousコンテキストアプリケーション全体でオブジェクトの」アンチパターンKaptajnKoldを引用

    : 私はあなたがそれを得たと思います。 しかし、私はそれが回避されるべきより多くの反パターンであるとも思う。なぜhereを参照してください。

    ご意見は、誤って実装されたContext Objectのバージョンを参照してください。コンテキストオブジェクト自体は反パターンではありません。

  • +2

    Win32APIを思い出させます。ここでは、単一のメソッド呼び出しのために巨大なオブジェクトを作成し、これをパラメータとして渡しました。このIMOは反パターンでした。プロパティの多くは、単一のメソッドコール、すなわちウィンドウのウィンドウサイズと位置にのみ関連していました。コンテキストオブジェクトのプロパティはあまり短命であってはいけません。また、現在のスコープ全体で共通している必要があります。ルート/親ウィンドウなどの一部のプロパティは、有効なコンテキスト情報です。うまくいけば、人々がパターンを誤用しているかどうかを考え、評価するのに役立ちます。それは確かに正確な科学ではありません。 – AaronLS

    0

    inializeにコンテキストを使用するクラス。このコードを検討してください

    public class BuildTagHandler extends TagHandler { 
    
         public BuildTagHandler(ServiceContext context) { // constructor 
          this.tagDAO = context.getTagDAO(); 
          this.buildDAO = context.getBuildDAO(); 
         } 
    

    あなたのクラスを構築するためにコンテキストを使用します。 文脈ファイルでは、これらのDAOオブジェクトをたくさん持っている代わりに、実装はしません。

    これはファサードパターンと解釈することも、巨大なインターフェイスがすべてのエントリをカバーすることもできます。

    関連する問題