簡単に言えば、「2ステップビュー」と「コンポジットビュー」のレイアウトデザインパターンの違いを教えてください。
2 に答える
複合ビューは、その名前が示すように、(GOFパターンのように)ビューの複合です。つまり、Composite Viewは、他の(Composite、Template、Transform、…)ビューのツリー構造であり、ルートのCompositeViewオブジェクトを介して均一に処理できます。
クライアントがルートビューにディスパッチすると、ツリー構造内のすべてのビューにディスパッチされ、結果ページが作成されます。したがって、複合ビューでは、個々のビューが(具体的な最終出力の)1ステップのビューであるため、2つのステップではなく、1つのステップしかありません。
複数のアトミックサブビューで構成される複合ビューを使用します。テンプレート全体の各サブビューを全体に動的に含めることができ、ページのレイアウトをコンテンツとは独立して管理できます。
簡略化された擬似コード:
composite = new CompositeView;
composite.add(new HeaderView(headerData));
composite.add(new TableView(tableData));
…
composite.add(new FooterView(footerData));
composite.render();
これは、2ステップビューが複合ではなく、最初にドメインデータからそのデータの論理画面表現に、次に具体的な出力形式に実行される2つのステップであるという点で2ステップビューとは異なります。つまり、ページの論理構造とフォーマットを分離します。
Two Step Viewは、変換を2つのステージに分割することにより、この問題に対処します。1つ目は、モデルデータを特定のフォーマットなしで論理的な表現に変換します。2つ目は、その論理プレゼンテーションを実際に必要なフォーマットに変換します。
簡略化された擬似コード:
twoStepView = new TwoStepView;
twoStepView.setData(data);
twoStepView.setFirstStep(new ConcreteScreen);
twoStepView.setSecondStep(new ConcreteHtmlScreen);
twoStepView.transform();
ご覧のとおり、Two-Step-Viewは2つのステップを調整しているだけです。たとえば、Two-Step-ViewがXSLTを使用している場合、入力XMLから画面XML、最終的なHTML出力への変換のみを処理します。その場合、ConcreteScreenとConcreteHTMLScreenはXSLTテンプレートになります。
「コンポジットビュー」は、コンポジションを介してビューをデザインするか、小さなパーツ(サブビュー)を組み合わせて全体を作成することを示唆するデザインパターンだと思います。これは、再利用性と保守性の向上に役立ちます。
一方、「2ステップビュー」は、主にZend Frameworkレイアウトによって駆動される、コンポジットビューデザインパターンの特定の実装です。この実装では、最初にサブビューのすべてのコンテンツを定義し(ステップ1)、次にlayout
レンダリングされたHTMLの適切な場所にサブビューをレンダリングできるようにする(ステップ2)ことをお勧めします。
私は一般的にレイアウトパターンのファンですが、2つのステップ(および最初にすべてのサブビューを定義する)を制限するという考えを見つけます。私は、Smarty3の拡張/ブロック機能がどのように機能するかに沿ってレイアウトを考える傾向があります。
http://www.smarty.net/docs/en/advanced.features.template.inheritance.tpl
Smartyのような機能では、構成に固定数のステップがありません。つまり、レイアウトはレイアウトを拡張でき、サブビューはさらにサブビューで構成できます。
お役に立てば幸いです。