ログ日記

作業ログと日記とメモ

Slim3の本の途中まで読んだ感想と代わりのチュートリアル

一昨日書いたこの本。

1/3までじっくり読んであとは流しでしか読んでないけど、これは要らなかった。
読んでいて全然頭に入ってこない。
というか写経用なので、ただ読んでるだけっていう使い方は間違っているんだろう。
サンプルを元に読みながら作っていかないと意味ないっぽい。


だだ…変数名とかエンティティ名が気になる。
変数を大文字で始めていたりアンダースコアが入っていたり。
GWTの説明も特にない。コードは書いてあるのだが、何故そうなっているかの説明が全然ない。
それからUiBinderを使うならGWT Designerを使えばいいのに何故か自作ツールを勧めている。
そして、何故かマルチモジュール構成で作っている。一つの画面にhtmlが一つ。GWTではこういう作り方は普通やらないんじゃないかな。普通はHistoryHandlerを使うと思うんだけど。
switch文やif文の羅列も良くない。ボタンのクリック処理も何故UiHandlerを一カ所にまとめてClickEvent#getSourceで分岐するんだろう。GWT Designerを使っていればそんなことにはならず、ちゃんとメソッドが分かれてくれる。


この本は写経用に書かれているのに、GWT+Slim3のための写経には全く適していないのだ。
Slim3の部分に関してはそんなに変なことは書いていないと思うのだが、全体的にGWTが絡んでくるサンプルになっているのでSlim3の部分だけ読むのも難しい。どこからどこまでがGWTSlim3かを意識させない作りになっていて、分からないままやっつけるのにはいいが理解の助けにするには向いていない。






これで終わるのも気が引けるので、自分的GWT+Slim3の始め方を書いておこう。


まず http://code.google.com/webtoolkit/doc/latest/DevGuideMvpActivitiesAndPlaces.html この辺のPart I から読む。
本はダメだと思う。どうしてもGWTの更新速度に追いつけない。本に載っているものがどんどん古い書き方になっていく。なので基本的に英語版Webのものを見る。
冗長でめんどくさいが、とりあえずMVPで作る。新しいGWTプラグインならMVPの新規作成に対応していて一気に複数のファイルを作ってくれるのでだいぶ楽になった。
このとき、UIはGWT Designerを使う。あとRootPanelとRootLayoutPanelの違いを別途調べる。後でハマると面倒なことになる。


一通り理解したつもりになったら、Slim3へ。


Slim3https://sites.google.com/site/slim3documentja/getting-started-with-gwt ここを写経。ただしGWTのコードはさっきの書き方に従う。
例えば

    @UiHandler({"tweet", "refresh"})
    void handleClick(ClickEvent e) {
        if (e.getSource() == tweet) {
            tweet();
        } else if (e.getSource() == refresh) {
            getTweetList();
        }
    }
    
    void tweet() {
        service.tweet(content.getText(), new AsyncCallback<Void>() {
            
            public void onSuccess(Void result) {
                content.setText(null);
                getTweetList();
            }
            
            public void onFailure(Throwable caught) {
                Window.alert(caught.getMessage());
            }
        });
    }
    
    void getTweetList() {
        service.getTweetList(new AsyncCallback<List<Tweet>>() {
            
            public void onSuccess(List<Tweet> result) {
                table.clear();
                for (int i = 0; i < result.size(); i++) {
                    table.setHTML(i, 0, result.get(i).getContent());
                }
            }
            
            public void onFailure(Throwable caught) {
                Window.alert(caught.getMessage());
            }
        });
    }
https://sites.google.com/site/slim3documentja/getting-started-with-gwt/listing-tweets

ここのコードは

    @UiHandler("tweet")
    void onTweetClick(ClickEvent e){
        presenter.tweet(content.getText());
    }
    @UiHandler("refresh")
    void onTweetList(ClickEvent e){
        presenter.getTweetList();
    }

    public void showError(String err){
        Window.alert(err);
    }
    public void cleanContent(){
        content.setText(null);
    }
    public void setTweetList(List<Tweet> result) {
        table.clear();
        for (int i = 0; i < result.size(); i++) {
            table.setHTML(i, 0, result.get(i).getContent());
        }
    }

こんな感じになる。
presenterのgetTweetListが非同期呼び出しを実行し、viewのsetTweetListを呼び出す。
ViewにServiceを書かないようにするとだいぶすっきりする。


Activityはこんな感じ。

    private abstract class MyCallback<T> implements AsyncCallback<T> {
        @Override
        public void onFailure(Throwable caught){
            view.showError(caught.getMessage());
        }
    }
    public void tweet(String text) {
        service.tweet(text, new MyCallback<Void>() {
            @Override
            public void onSuccess(Void result) {
                view.cleanContent();
                view.getTweetList();
            }
        });
    }

MyCallbackはユーティリティ的なクラス。毎回エラー用処理を書くのが大変なので、復帰用の特別なコードがないなら共通化する。
これで一通り終了。


このあとはWindow.alertをGwtEventとEventHandlerに置き換えたり新しいPlaceを作って動きを確かめたり、Slim3トランザクションを試したり、など。GWTSlim3のマニュアルから適当なところをかいつまんで書けば大体の動きが分かると思う。



ここまで勢いで書いたが、まだGWTSlim3のアプリを作ったことはない。むしろ教えて欲しい。(そのために本を買ったのだった)