0

この状況で、PureMVC で継承されたクラスのビューのベスト プラクティスを知りたいと思っていました。

  • 複数のクラスが BaseClass を継承します (InheritedClass1 と InheritedClass2 としましょう)
  • 各 InheritedClass にはそれぞれのビューがあります (基本ビュー クラスから派生していますが、それぞれが一意です)。
  • 特定のデータセット (InheritedClass1/2 オブジェクトの ArrayCollection など) を使用して、それぞれのビューを動的にロードする必要があります。
  • データセットは比較的大きいため、TileList が適しています (現在表示されているオブジェクトのみをインスタンス化するため)。

いくつかの解決策を考えることができますが、それらは「ハック」すぎて最適な解決策にはなりません。

  • In View: ビューを State に関連付ける BaseClassView のリピーター (InheritedClass1 オブジェクトを追加するために "InheritedClass1" 状態に設定) 長所: 不要なメモリの増加がない (State オブジェクトは必要に応じてインスタンス化される)データ型なので、カップリングが追加されます

  • Mediator: ArrayCollection をループし、データ型に基づいてビューを addChild() します。 長所: 動作します。短所: メディエーターはビューに何かを追加しているため、メディエーターとビューの分離のポイントが無効になります。リピーターより遅い。

コメントやその他の提案をいただければ幸いです。ありがとう!

4

4 に答える 4

1

短所:ビューはデータ型に依存するため、結合を追加します

通常、ビューコンポーネントには、ドメインデータを表示し、場合によってはユーザーがドメインデータを操作できるようにする以外の目的はありません。ビューコンポーネントがドメインデータをある程度理解している必要があるのは当然のことです。

したがって、VOのコレクションをビューコンポーネントにフィードしても、「悪い」結合は追加されません。「悪い」結合とは、ビューコンポーネントがモデル層に到達し、データを保持するプロキシを操作する方法を知っている場合です。または、モデル層のプロキシが、ビューコンポーネントまたはメディエーターを使用してデータをそれらに挿入する方法を知っている場合。

メディエーターはビューに物事を追加していますが、これはメディエーターとビューの分離のポイントを打ち負かします。

Coded Signalが指摘しているように、メディエーターをビューコンポーネントから分離しようとはしていません。メディエーターは、ビューコンポーネントを認識し、ビューコンポーネントとシステムの他の部分との間の通信を仲介する必要があるPureMVCシステムの1つのアクターです。メディエーターは、ビュー層とモデル層の間の結合を緩めることに関して、システムで最も重要なアクターです。

ビューコンポーネントと通信するために、他のアクターは通知を送信します。メディエーターはこの通知を聞いて、ビューコンポーネントの公開されたAPIを操作することで応答します。データをスプーンフィードするか、メソッドを呼び出します。これにより、アプリの残りの部分がコンポーネントについて何も知る必要がなくなります。

また、メディエーターはコンポーネントのイベントをリッスンし、コンポーネントに代わって動作し、モデル層からデータを取得したり、他のメディエーターにメモを送信したり、コントローラー層でコマンドをトリガーしたりします。これにより、コンポーネントは接続先のシステムについて何も知る必要がなくなります。プロパティとメソッドのAPIを公開し、それ自体の動作をカプセル化し、システムが知っておくべきことが起こったときにイベントを送信するだけです。

したがって、メディエーターとビューコンポーネントが一緒になって、アプリケーションのビュー層を構成します。

-=崖>

于 2009-12-07T23:39:06.950 に答える
1

最初の例が気に入れば、答えは簡単です。ビュー コンポーネント (または状態) にデータ型を割り当てるメディエーターにマップ (Object()) を持たないのはなぜですか。例えば:

private static var map:Object = {"ic_oneType": "ic_oneState",
                                 "ic_twoType": "ic_twoState"}

そして、メディエーターはそのマップを BaseClassView に割り当てることができます。

メディエーターから渡されたデータに基づいて、継承されたすべてのビューをレンダリングする何らかの形式の viewProxy が必要であるという考えに同意する可能性があります (たとえば、最初の例)。より具体的な例はありませんが、状態が UI での最善の行動方針であるかどうかを確認または拒否できます。

于 2009-07-14T11:15:50.197 に答える
1

メディエータビューの一部です。それらをビューからどのように分離するかは私にはわかりません。

私はオプション2で手に入れました。

以下は、pureMVC フォーラムのトピックです: ビュー コンポーネントを動的に追加する: どこでそれを行う必要がありますか? . 「pureMVC」による投稿は、あなたにとって興味深いはずです。

また、データセットのサイズが問題になる可能性があります。それが本当に大きい場合は、アイテムごとにコンポーネントを追加するのではなく、レンダラーでリストを使用することを検討する必要があります (リピーターはそれを行います)。メインコンポーネントをモデルから分離したままにするためにデータをラップする必要があるため、これはさらに複雑になります。

于 2009-07-14T11:19:55.833 に答える
0

短所: メディエーターはビューに何かを追加しているため、メディエーターとビューの分離のポイントが無効になります。

そうではありません: ドキュメントでコラボレーション ペアと呼ばれるものであり、そのように扱われるべきです。

于 2009-07-30T18:21:03.440 に答える