2011年4月 2日 22:40

Scenic3とPirkaEngineでjubeat plusのスコア登録サイトを作ってみた #appengine #slim3 #scenic3

4/1公開でしたがガチ企画でした。

jubeat++

技術的なこととか
appengineとslim3は前から使っていましたが、今回はScenic3とPirkaEngineも使ってみました。

詳しくは下記の記事を参照

Slim3 に Scenic3 と PirkaEngineを使う方法 - やさしいデスマーチ


2画面くらい作ったところでこの記事を読んで導入しましたw

Scenic3所感
前の記事でも書きましたがControllerクラスが増えすぎないのがいいですね。
今回作ったPageクラスは11クラス(TQやcronも含む)ですが、Controller換算だと26個ありました。小規模なアプリだからこの程度ですが規模が大きくなるとScenic3でController爆発を防げるかもしれませんw

複数のControllerクラスを1つのPageクラスにまとめることによりリファクタリングもやりやすかったです。(フォームのバリデータとか)

Slim3はControllerのパッケージ階層がURLの階層を表していましたが、Scenic3ではそうではないためちょっと違和感が
  • Slim3ではrootPackage.controller.xxx.YyyCrontrollerが /xxx/yyy に対応していますが、Scenic3の仕様上Pageクラスはどこに置いてもいいので対応づけができない?
  • パッケージ移動やクラス名変更が外に影響を与えないのはメリットと言えばメリットか
jubeat++では net.sue445.jubeatplusplus.page.home.HomeFrontPage のようにディレクトリ階層に合わせてパッケージも階層化していました。
クラス名にわざわざディレクトリ名もつけているのは、同一ワークスペース内に同名クラスがあるとEclipseのCtrl+T(名前指定でクラスを開く)で単一に絞られないためw

安西先生、Slim3みたいにAntでPageクラスのテスティングペアを自動生成をしたいです・・・

PirkaEngine所感

HTMLをテンプレートとして使えるのはいいですね。jspだとspin up時のコストもあるしローカルサーバを起動してないといけないですが、普通のHTMLだとブラウザで簡単に確認できるのがいいです

今回デザイン周りをほっしーさんに協力してもらいましたm(_ _)m
ほっしーさんにHTMLテンプレートを渡して、修正されたテンプレートをそのままワークスペースに組み込むことができました。JSPで開発してるとデザイナが作ったHTMLをJSPに置き換える作業が発生しますが、PirkaEngineだとそれがないのがいいです

PirkaEngineの仕様上XHTMLじゃないとエラーが起きますが、それはテストケースを作ることで対応可能

Datastoreアクセスを抑えるためにスコアページでは整形済のHTMLページをキャッシュとして持たせる方法を採用しましたが、ここでもPirkaEngineが力を発揮。
JSPだとページの内容をアプリ側で管理してキャッシュすることはできないし、かといってStringBuilderで連結する方式だとデザインを考えながらページを成形するのが面倒です。
PirkaEngineだとテンプレートに差し込み変数を入れた後のレスポンスをアプリ側で持っているため、それをDatastoreなりMemcacheで保存することも可能。こういう風に必要に応じてレスポンスを簡単にキャッシュできるのもPirkaEngineのメリットかと

ちなみにパフォーマンスはこんな感じです。(DatastoreとMemcacheのデュアルキャッシュを採用(Memcache優先))
  • キャッシュ未使用時:1284ms 2933cpu_ms 16api_cpu_ms
  • Datastoreのキャッシュ使用時:163ms 358cpu_ms 8api_cpu_ms
  • Memcacheのキャッシュ使用時:23ms 46cpu_ms
地味にですがキャッシュ採用のパフォーマンスアップの効果が出ています。


TDD(テスト駆動開発)信者なのでがっつりテストを書きましたw
  • 実装したクラス80、1775行
  • それに対するテストケース414個
  • カバレッジはlineとbranchともに92%(APTで自動生成されるModelMetaやPageMatcherは除外。Util系のprivateコンストラクタや例外ハンドリング以外はだいたい網羅できてるかと)
  • テストコードをたくさん書いておくことでリファクタリングもガンガンできるので常にコードをクリーンに保つことができます。ノーモアレガシーコード
  • appengineのバージョンアップでちょくちょく挙動が変わるためそれを検出するのにも有効です。
    つい最近だと1.4,2→1.4.3でTQの挙動が微妙に変わってました。(TaskName未指定時は勝手に補完してくれていたが、バージョンアップしてからはエラーになるようになった)