10

現在、私はアプリケーションのコーディングを行っており、現在行っていることに対するより良い解決策が必要であると考えています。

プログラムの設定を処理するメイン ウィンドウがあります。次に、さらにクラスとウィンドウがあります。たとえば、「メイン関数」に必要なユーザー入力を処理する言語ハンドラー クラスとフォームです。

ただし、言語ハンドラはメイン ウィンドウの文字列を変更できるため、これまでは常にメイン ウィンドウをこの各クラスに渡す必要がありました。また、他のフォームもメイン ウィンドウにデータを渡すことができる必要があります。

さらに多くのクラスがあり、すべてのクラスがメイン ウィンドウのコピーを必要とする場合、メイン ウィンドウの「サイズ」に応じて多くのリソースが消費されます。

したがって、これらのクラス間で通信するためのより良い/より効率的な方法はありますか?

4

4 に答える 4

13

これを行う一般的な方法は、オブザーバー パターン(.NET ではイベント システム) を使用することです。簡単に言うと、クラスは互いのイベントをサブスクライブし、イベントが発生したときにアクションを実行します。コメントに記載されているように、参照を渡すことはメモリを大量に使用することではありませんが、コードのさまざまな部分間で密結合が発生します。オブザーバー パターンはその問題に対処します。

于 2012-08-31T08:04:01.017 に答える
3

別のオプションは、クラスをサービスと見なすことです。それらをインターフェイスにコーディングし、依存性注入(制御の反転) を使用してオブジェクト グラフを作成します (IoC コンテナーに必要な情報を伝えると、frmSomething必要なサービス/クラスが決定され、必要に応じてインスタンス化されます)。

この意味は:

  • 実装ではなくインターフェースに対してコーディングするだけで済みます
  • あなたのコードは疎結合です ( と を入れ替えることができ、両方が同じインターフェースに準拠しOldTranslatorNewTranslatorいる限り、コンテナーの構成以外は何も変更する必要はありません)
  • まだ書かれていないサービスに依存する高レベルの機能を開発でき、コードはコンパイルされます
  • コンテナーに登録されているクラス/サービスを変更することで、必要に応じて実行時にアプリの動作を非常に簡単に変更できます。

MS-Supported DI コンテナーについては、Unityを参照してください。ウィンザー城は人気のある代替案ですが、他にもたくさんあります

あなたが言ったようにメインウィンドウの「コピー」を渡すことは悪いことではないことに注意する価値があります.プリミティブは参照型です)。これは、オーバーヘッドがほとんどないことを意味します

于 2012-08-31T08:07:51.153 に答える
2

IVAN によって与えられた ans に加えて..これらすべての用語を使用せずに上位レベルのビューを見ると、InMemoryStorage として機能する静的クラスを作成し、その上にフィールドを定義して情報を保存し、
これを完全に制御する必要があります。共有されているものを超えて、複数のコンポーネントがそれを変更でき
ます。さらに、ゲッターとセッターを定義し、プロパティが変更されるたびにイベントを発生させて、さまざまなフォームまたはウィンドウ (ビュー) が変更をサブスクライブし、それに応じてアクションを実行できるようにすることができます。

于 2012-08-31T08:04:50.223 に答える
2

GalasoftまたはPrism MVVM 実装を使用することをお勧めします。そこでは、非常に使いやすいメッセージング サービスを使用できます。情報が必要なクラスはサブスクライバーにメッセージを送信するだけで、サブスクライバーは必要なすべてのデータを送信できます。これがコミュニケーションを処理する最も簡単な方法だと思います。

于 2012-08-31T08:01:21.150 に答える