Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

Locked History Actions

GWT/GWTP/RCP

コマンドパターンによるRCP

概要

コマンドパターンによるRPCは、それまでの生のRPC(GWT/RPC])とは全く異なるものになる。 以下ではクライアントサイドから見た違いを概観する。

従来型のRPC

  • 一つ以上のメソッドの定義されたRPCインターフェースを作成し、そのインターフェースのサーバプロキシを取得する。
  • いずれかのメソッドを呼び出し、結果を得る。ただし、呼び出しは常に非同期なので、実際には定義インターフェースに対応する非同期インターフェースを使うことになる。

コマンドパターンによるRPC

  • RPCの一つのメソッド呼び出しを一つのオブジェクトとして実現する(SendTextToServer)。つまり、クラス名で「メソッド」を表し、そのコンストラクタパラメータとして「メソッド引数」を実現する。

  • 呼び出しの結果値は別のオブジェクト(SendTextToServerResult)として実現する。

  • サーバ呼び出し機構(AsyncDispatch)のexecute引数として、呼び出しオブジェクトを指定し(SendTextToServer)、結果を得る。もちろん非同期なので、コールバックの結果としてSendTextToServerResultが与えられる。

実際のコード

GWTPのサンプルとして生成される実際のコードを見てみる。

SendTextToServer --- コマンド:引数としては一つの文字列のみ

import com.gwtplatform.dispatch.shared.UnsecuredActionImpl;
import com.cm55.gwtp.shared.SendTextToServerResult;

public class SendTextToServer extends
    UnsecuredActionImpl<SendTextToServerResult> {

  private String textToServer;

  @SuppressWarnings("unused")
  private SendTextToServer() {
    // For serialization only
  }

  public SendTextToServer(String textToServer) {
    this.textToServer = textToServer;
  }

  public String getTextToServer() {
    return textToServer;
  }
}

SendTextToServerResult --- レスポンス:返り値としても一つの文字列のみ

import com.gwtplatform.dispatch.shared.Result;

public class SendTextToServerResult implements Result {

  private String response;

  @SuppressWarnings("unused")
  private SendTextToServerResult() {
    // For serialization only
  }

  public SendTextToServerResult(String response) {
    this.response = response;
  }

  public String getResponse() {
    return response;
  }
}

ResponsePresenter内の呼び出し。dispatcherはあらかじめResponsePresenterに「注入」されているのだが、ここでは言及しない。

    dispatcher.execute(new SendTextToServer(textToServer),
        new AsyncCallback<SendTextToServerResult>() {
          @Override
          public void onFailure(Throwable caught) {
            getView().setServerResponse(
                "An error occured: " + caught.getMessage());
          }
  
          @Override
          public void onSuccess(SendTextToServerResult result) {
            getView().setServerResponse(result.getResponse());
          }
        });

コマンドパターンRPCのメリット・デメリット

何がウレシイのか?

Google I/O 2009 - Best Practices for Architecting GWT Appの8分経過あたり。

Command Pattern to make async tolerable(非同期を扱いやすくするためのコマンドパターン)

  • Leverage point for(活用ポイント)
    • Caching
      同一のコマンドが実行された場合に、その結果をキャッシュから返すことができる。

    • Batching
      複数のコマンドを束ねて一度にそれをサーバに送りこむことができる。

    • Centralize failure handling
      failureハンドリングを一箇所で行うことができる。

  • Lays the groundwork for
    • GWT.runAsync()
    • Undo / Redo
    • Gears / HTML5 DB

※早口で簡単に説明されているのでよくわからない点あり。

デメリット(と思われるもの)

  • 従来型のRPC呼び出しメソッド一つについてクラスが二つ必要になる。