= コマンドパターンによる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 { 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() { @Override public void onFailure(Throwable caught) { getView().setServerResponse( "An error occured: " + caught.getMessage()); } @Override public void onSuccess(SendTextToServerResult result) { getView().setServerResponse(result.getResponse()); } }); }}} == コマンドパターンRPCのメリット・デメリット == === 何がウレシイのか? === [[http://www.google.com/events/io/2009/sessions/GoogleWebToolkitBestPractices.html|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呼び出しメソッド一つについてクラスが二つ必要になる。