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呼び出しメソッド一つについてクラスが二つ必要になる。