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