web-dev-qa-db-ja.com

MVPパターン、イベント、複雑なオブジェクトの保存に関する質問

私は、3Dモデル、Openglグラフィック、階層プロジェクトファイルを含み、MVPアプローチを使用するwinformsプロジェクトに取り組んでいます。現在、ユーザーがオブジェクトを操作すると、オブジェクトによってトリガーされたイベントを使用してビューが更新されるように設定しています。たとえば、階層に追加された各オブジェクトについて。リスト。ハンドラーを追加する必要があります(イベントに宣言できるオブジェクトに変数が割り当てられていないため)。この階層を格納(シリアライズ)する場合、ハンドラーは含まれません。そのため、プロジェクトファイルを開くと、これらのハンドラーを再度セットアップする必要があります。そうしないと、何も動作しなくなります。これは面倒で、私はどちらかを検討しています:

  • すべてのメソッドと関数をそれぞれのクラスからライブラリに削除することで、最終的にデータのみが階層に格納され、内部イベントが一緒に使用されるのを回避します。または
  • すべてのメソッド、関数、およびイベントを、シリアル化されていない継承可能なクラスに移動する

このプロジェクトは特定の「クリティカルマス」に達し、私の限られた経験では設計の選択を過ぎて見ることができないので、セットアップを何度も変更することに消極的になり始めています。だから私は、より大きなプロジェクトの経験を持つ誰かが私にいくつかのアドバイスを与えることができるかどうか疑問に思っていますか?または、このアプローチが長期的に問題を引き起こすかどうか、またはこれらの問題の処理に関するいくつかの指針を教えてください。いずれにせよ、すべての助けを歓迎します。

更新:

こんにちは、質問にお答えいただきありがとうございます。以下で受け取った入力に基づいて、データ転送オブジェクトDTO、データ値またはアクセスオブジェクト、ドメインオブジェクト、ビジネスレイヤー、永続性レイヤー/データレイヤー、および作品などのトピックについて読み始めました。残念ながら、ほとんどの例はデータベースとテーブルを扱っていますが、これは3Dの世界にはあまり適していませんが、本質は今では明らかです。

事実上、すべてのデータを保持し、簡単にシリアル化できるプロジェクト階層のデータのみの表現を作成しました。すべてのデータオブジェクトは、データを操作して動作を提供する機能(イベントやハンドラー)を追加するドメインオブジェクトにプラグインされます。ここでは、すべてのセッターとゲッターがデータオブジェクトの変数をポイントしています。ドメインオブジェクトも、データレイヤーと同様に階層を形成します。ハンドラーのリストの維持を回避するために、単一のオブジェクトのイベントをハードワイヤーし、参照をアクティブ/操作中/更新が必要なオブジェクトのみに変更しました。

したがって、今私はモデルビュー(パッシブ)プレゼンター+データ/永続性レイヤーの配置を持っています。入力いただきありがとうございます。

最高のPeteByte

1
PeteByte

私は永続的なデータをDTOに分離します。DTOは、構築時にハンドラーがどのような存在であるかを教えられた完全に長寿命のオブジェクトによって消費および生成されます。

この方法で、階層やライブラリを作成する必要はありません。永続的なデータが行き来します。そのデータの処理方法を知っているオブジェクトは、他のオブジェクトにメッセージを送信して、必要なことを伝えます。

それぞれの長寿命のオブジェクトは、単一のアイデアを処理するために必要なものほど複雑であってはなりません。

私はこのパターンを何度もうまく使ってきました。私のお気に入りはチェスAIとチームメイトが作成したことです(偶然にもトーナメントで優勝しました)。ゲームの種類ごとに1つのオブジェクトがありました。ボードにはポーンが16個ありますが、ポーンオブジェクトは1つしかありませんでした。そして、あなたがそれを言うまで、それはボードのどこにあるのか知りませんでした。私はそれへの多くの参照をボードに保存しました。それが合法的な動きであるかを理解することが唯一の仕事でした。

これは「世界をオブジェクトとしてモデル化する」というスタイルに直面していることは知っていますが、真のオブジェクト指向プログラミングはそのようには行われていないことがわかりました。実世界には存在しないもののオブジェクトを作成することもあります。

規定されたスタイルではなく、ニーズに合わせてコードを書くことをためらわないでください。あなたにアドバイスを与えるほとんどの人はあなたが今何をしているかわからない。

3
candied_orange