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