2010-03-13

GAE/J + Slim3 [はじめてのSlim3(5)]

今回でSlime3公式サイトの「Getting Started」チュートリアルは最後、「Listing tweets」で入力したtweetが一覧表示されるようになる。

  • まずはMVCモデルのViewの部分となる war/twitter/index.jspを修正する。<form>~</form>の後に下記コードを追加する。
    ここでやっていることは
    1. "forEach"でtweetListから要素を一つづつ取り出す
    2. その要素をh()でエンコードして表示
    3. <hr />で水平線を表示
    で、この部分に一覧表示されることになる。
    <c:forEach var="e" items="${tweetList}">
    ${f:h(e.content)}
    <hr />
    </c:forEach>
  • では http://localhost:8888/twitter/ にアクセスして表示してみる。
    ...
    一覧に何も表示されない、これはJSPで表示しようとしている"tweetList"が作成されていないからだ。
  • war/twitter/index.jspに対応するのはcontroller.twitter.IndexContorollerとなるので、このクラスで"tweetList"を作成することになる。
    ということで、まずはテスト(仕様)を書く。controller.twitter.IndexContorollerTest#run()の最後に下記を追加する。
    assertThat(tester.requestScope("tweetList"), is(notNullValue()));
  • それじゃ、テスト実行(もう慣れたかな?リズムに乗ろう!)
    結果は...Red(NG) なぜかというと、まだIndexControllerに"tweetList"を作成するコードを書いていないから、ということでこの段階では"正常"。
  • では、IndexControllerを修正しよう。
    ここで一つTips、eclipseに「moreUnit」プラグインがインストールされていれば"Ctrl+J"でテストクラスと対象クラスを行き来できるようになるので切り替えが楽チンです。
    修正後は下記のようになる。
    ここでやることは
    1. TwitterService#getTweetList()でTweetのリストを取得する。
    2. それをrequestScope("tweetList", tweetList)でアトリビュート"tweetList"にセットする。
    public class IndexController extends Controller {
        private TwitterService service = new TwitterService();
        @Override
        public Navigation run() throws Exception {
            List<Tweet> tweetList = service.getTweetList();
            requestScope("tweetList", tweetList);
            return forward("index.jsp");
        }
    }
  • ここでgetTweetList()が未定義というエラーが出る。そう、TwitterService#getTweetList()はまだ存在していない。getTweetList()を作ることになるのでが、その前にテストを作る(「テスト駆動」だね(^_-))
    TwitterServiceTestに下記のテストメソッドを追加する。ここで"getTweetList()"がエラーとなっているはず。
    @Test
    public void getTweetList() throws Exception {
        Tweet tweet = new Tweet();
        tweet.setContent("Hello");
        Datastore.put(tweet);
        List<Tweet> tweetList = service.getTweetList();
        assertThat(tweetList.size(), is(1));
        assertThat(tweetList.get(0).getContent(), is("Hello"));
    }
  • では続いてビルドエラーをなくすためにTwitterService#getTweetList()メソッドを作る。エラーの出ている箇所にカーソルを合わせて"Ctrl+1"を押す。
    "型TwitterServiceのgetTweetListメソッドを作成します"を選ぶ。
  • するとTwitterServiceのソースが開いてgetTweetListメソッドの雛形ができているので下記のように修正する。
    フィールド t を定義
    private TweetMeta t = new TweetMeta();
    getTweetListメソッドを次のように修正する
    public List<Tweet> getTweetList() {
        return Datastore.query(t).sort(t.createdDate.desc).asList();
    }
  • さあ、これでコンパイルエラーがなくなったので、テストを実行する。
    ...
    結果はGreen(OK)
    全てのテストを実行していない場合はこれが最後なので実行しておこう。
    全テストを実行してもさほど時間はかからないので、必ず全テストを実行するようにしよう。(ちょっとした修正が思わぬところに影響を及ぼすこともあるので)
  • テストがAll Green(OK)となっていることを確認して http://localhost:8888/twitter/ にアクセスして動きを確認してみよう。
    何か文字列を入力して[tweet]ボタンをクリックすると一覧が表示される。
  • GAEにデプロイしてアクセスしてみよう。ローカルと同じように動くのが確認できる。うーん、簡単すぎる(^_^;
  • これでTutorialが終了した。
    ここで、一通り終えてみての感想を...
    • 全般的に、サクサクとストレスなく進められて気持ちイイ
    • Slim3 DatastoreのAPIが「S2JDBC」のような"流れるようなインタフェース"でスラスラ書けて読みやすい
    • 「テスト駆動(TDD)」は、普段の開発(主に「Teeda」)で実践しているので、特に違和感なく進められる。
      未経験の人はぜひ実践を。「アジャイルプラクティス 第5章 作る前から使う」に書かれているがシンプルな設計になり易い
開発(特に仕事の場合)は、様々なストレス要因があってプログラミングに集中できないことが多い。集中できないとミスをおこす可能性も高くなるので、余計な事に気を使わずにテンポよくプログラミングが進められる「Slim3」は気に入りました。
 今度、会社でGAE/J上に構築する予定のシステムがあるので「Slim3」を使ってみようかと思います。
個人でもアカウントは作ってあるので家族で使うようなアプリを作ってみようかな。

0 件のコメント: