0

私はこのチュートリアルを見てきました https://developers.google.com/web-toolkit/articles/mvp-architecture 私が疑問に思ったのは、このMVPスタイルで、ユーザーがページを変更するたびにそれが行き、 Presenter の新しいインスタンスを作成します。プレゼンターがシングルトンの場合、プレゼンターはより良いでしょうか? 私の最終目標は、PhoneGap を使用してアプリを展開することです。これにより、パフォーマンスの向上が役立つようになります。

4

3 に答える 3

0

それはすべて実装に依存します。

状態をビューに保存したい場合は、シングルトンのプレゼンター/ビューを使用できます。

ビューを再初期化する必要がないため、より効率的ですが、別のビューの一部のトランザクションが最初のビューを変更する必要がある変更を行う場合は効率が低下します。この場合、最初のプレゼンターでキャッチされ、それに応じてビューを変更する 2 番目のプレゼンターでイベントを発生させる必要があります。これにより、アプリケーションの予測が少し難しくなります。

したがって、各プレゼンター/ビューが独立している場合は、単一のビュー/プレゼンターが適しています。

それ以外の場合は、新しいプレゼンター/ビューを使用して、ビューが使用するフォームのデータを再初期化します。

ただし、アプリケーション全体の変数 (イベント バスなど) を使用する新しいプレゼンターは破棄 (ガベージ コレクション) されないため、次の問題が発生することに注意してください。

ビューをロードし、対応するプレゼンターでキャッチされるイベントが発生するたびに、新しいプレゼンター/ビューが生成されるたびに、イベントとすべての計算が発生します。

例: -Presenter1/View1 がロードされ、いくつかのイベントをキャッチします -Presenter2/View2 がロードされます -Presenter1(新しいインスタンス)/View1(新しいインスタンス) がロードされ、いくつかのイベントをキャッチします。-グローバル イベント バスを介してイベントが発生する -Presenter1 がイベントをキャッチする -Presenter1 (新しいインスタンス) がイベントをキャッチする

したがって、本質的に (これは規則ではありません)、新しいプレゼンターは GWT アプリケーションに完全なポストバック感のある Web ページを提供し、それ以外の場合は、既存のフォームをロードするデスクトップ アプリケーション感があります。

お役に立てれば。

于 2013-01-17T10:25:24.987 に答える
0

シングルトンを使用しないでください...うーん!

プレゼンターを遅延して初期化し、再利用のために参照を保存する場合は、毎回新しいインスタンスを作成する必要はありません。

ビューを再利用する方法と同様に、プレゼンターを再利用する方法を強調するために、 https://developers.google.com/web-toolkit/articles/mvp-architecture-2#code_splittingから取得して変更した次の例を見てください。 .

 public void onValueChange(ValueChangeEvent<String> event) {
    String token = event.getValue();

    if (token != null) {
      if (token.equals("list")) {
        GWT.runAsync(new RunAsyncCallback() {
          ...
          public void onSuccess() {
            // lazily initialize our views and presenters, and keep them around to be reused
            if (contactsView == null) {
              contactsView = new ContactsViewImpl<ContactDetails>();
            }
            if (contactsPresenter == null) {
              contactsPresenter = new ContactsPresenter(rpcService, eventBus, contactsView);
            }
            contactsPresenter.go(container);
          }
        });
      }
      ...
   }

RunAsyncCallback によるコード分割のパフォーマンス上の利点に加えて、基本的に、各プレゼンターへの参照を AppController クラス フィールドとして保持し、履歴トークンを切り替えるときにそれらを再利用します。

于 2013-01-19T01:52:23.430 に答える
0

gwt-platformを使用することをお勧めします。いくつかのプロジェクトで使用しましたが、パフォーマンスの問題はありませんでした。これは非常に強力であり、優れたパフォーマンスを維持しながら将来的にアプリケーションをより簡単に拡張できるようにアプリケーションを構築するのに役立ちます。

于 2013-01-20T12:51:22.817 に答える