Deletions are marked like this. | Additions are marked like this. |
Line 74: | Line 74: |
ResponsePresenter内の呼び出し。dispatcherはResponsePresenterに「注入」される。 | ResponsePresenter内の呼び出し。dispatcherはあらかじめResponsePresenterに「注入」されているのだが、ここでは言及しない。 |
Line 90: | Line 90: |
== コマンドパターンでは何がウレシイのか? == [[http://www.google.com/events/io/2009/sessions/GoogleWebToolkitBestPractices.html|Google I/O 2009 - Best Practices for Architecting GWT App ]]の8分経過あたり。 • Leverage point for • Caching • Batching • Centralize failure handling • Lays the groundwork for • GWT.runAsync() • Undo / Redo • Gears / HTML5 DB |
コマンドパターンによる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()); } });
コマンドパターンでは何がウレシイのか?
Google I/O 2009 - Best Practices for Architecting GWT Appの8分経過あたり。
- • Leverage point for
- • Caching • Batching • Centralize failure handling
- • GWT.runAsync() • Undo / Redo • Gears / HTML5 DB