バックグラウンド
Model-View-Presenterデザインパターンを、アプリケーションの抽象ファクトリパターンおよび「シグナル/スロット」パターンとともに使用して、2つの主要な要件を満たします。
- テスト容易性の強化(非常に軽量なGUI、すべてのアクションを単体テストでシミュレートできます)
- 「ビュー」を他のビューから完全に独立させて、他に何も変更せずに実際のビューの実装を変更できるようにします
そのために、コードは4つのレイヤーに分割されています。
- コア:モデルを保持します
- プレゼンター:ビューインターフェイス(以下を参照)とコア間の相互作用を管理します
- ビューインターフェイス:ビューの信号とスロットを定義しますが、実装は定義しません
- ビュー:ビューの実際の実装
プレゼンターがビューを作成または処理する場合、抽象ファクトリを使用し、ビューインターフェイスについてのみ認識します。
ビューインターフェイス間の信号/スロットバインディングを実行します。実際の実装は関係ありません。「ビュー」レイヤーには、実装を処理する具体的なファクトリがあります。
シグナル/スロットメカニズムは、boost::functionに基づいて構築されたカスタムフレームワークを使用して実装されます。
本当に、私たちが持っているのはそのようなものです:http: //martinfowler.com/eaaDev/PassiveScreen.html
すべてが正常に動作します。
問題
しかし、解決方法がわからない問題があります。
たとえば、非常に単純なドラッグアンドドロップの例を見てみましょう。
2つのContainersView(ContainerView1、ContainerView2)があります。ContainerView1にはItemView1があります。ItemView1をContainerView1からContainerView2にドラッグします。
ContainerView2は、異なるタイプのItemView2を作成する必要がありますが、これはItemView1と同じモデルオブジェクトを「指します」。
したがって、ContainerView2は、ItemView1をパラメーターとしてドロップアクションに対して呼び出されるコールバックを取得します。ContainerPresenterBを呼び出し、ItemViewBを渡します。
この場合、ビューのみを扱っています。MVP-PVでは、ビューはプレゼンターやモデルについて何も知らないはずですよね?
ItemView1がどのモデルオブジェクトを表しているのかわからないまま、ItemView1からItemView2を作成するにはどうすればよいですか?
すべてのビューに「itemId」を追加することを考えました。このIDは、ビューが表すコアオブジェクトのIDです。
したがって、擬似コードでは、ContainerPresenter2は次のようになります。
itemView2=abstractWidgetFactory.createItemView2();
this.add(itemView2,itemView1.getCoreObjectId())
詳細についてはあまり詳しく説明しません。それはうまくいきます。私がここで抱えている問題は、それらのitemIdがポインタのようなものであるということです。そして、ポインタがぶら下がっている可能性があります。誤ってitemView1を削除すると、coreObject1が削除されると想像してください。itemView2には、無効なcoreObjectを表すcoreObjectIdがあります。
よりエレガントで「防弾」のソリューションはありませんか?
私はObjectiveCやmacOSXプログラミングを行ったことがありませんが、私たちのフレームワークがCocoaフレームワークと非常に似ていることに気づかずにはいられませんでした。彼らはこの種の問題にどのように対処しますか?グーグルでそれについてのより詳細な情報を見つけることができませんでした。誰かがこれに光を当てることができれば。
この質問があまり混乱しないことを願っています...