reactive programming with apache wicket
TRANSCRIPT
Reactive Programming with Wicket
2016/04/28
Reactive Programming “Object Oriented Approach”を Websシステム開発にとり⼊れた実践事例の紹介
⾃⼰紹介
仕事はJava
Scalaが好き
Wicket歴3年
Twitter: rysh@cactaceae
話すこと
Apache Wicket
ViewとModelの分離
Object-Oriented Reactive Programming
話さないこと
Reactive Streams
Functional Reactive Programming
Reactive Extensions
Reactive Application
Wicketとは
2004年開発スタート
2015年まで⽣き残った14のJava製Web FWの⼀つ
コミニュティもまだまだ活発
なぜWicketでReactive?
⼊社時にWicketが使われていた
諸事情あり
Wicketを使ったプログラミングの効率を追求
Wicketの特徴Swing likeなAPIでオブジェクト指向らしく書ける
Viewに使うHTMLは単体でも正しく表⽰できる
再利⽤性が⾼いComponent
AjaxにはJavaScriptを⾃動⽣成して対応
画⾯の差分更新もFWがやってくれる
Hello World
アーキテクチャ
コンポーネントベース
ステイトフル
J2EEのフィルタ上に実装され、AP Serverで動作
HTTPプロトコルをラップ(隠蔽)して意識させない
Wicketプログラミングの基本
あらゆるコンポーネントは継承による拡張が前提
Overrideして振る舞いを変える
Behaivorによる委譲も使える
匿名クラスを多⽤
WicketのComponent
HTMLタグや画⾯部品に対応したクラス
必ずComponentクラスを継承している
メンバにIDとModelを持つ
コンポジットパターンでDOMのTree構造を表現している
WicketのModel
データのWrapper
Componentに対応するViewにデータバインドで表⽰
WicketのModel
Wrapperとしての利⽤例
よくあるGUIの問題
ModelがただのWrapperなのでComponentクラス内でデータ取得することになる
Viewのあちこちにビジネスロジックが埋め込まれる
Reactive Programming
データフロー (data flows) に着⽬
変更を伝播 (propagation of change)
Imperative Programmingb = 1
c= 2
a = b + c
b = 10
print(a) // 3が出⼒
・aは代⼊された時点の値を保持する
Reactive Programmingb = 1
c= 2
a = b + c
b = 10
print(a) // 12が出⼒
・右辺の値が変わると左辺に伝播される (いつ伝播されるかは実装による)
SPEEDAのデモ
GUIのデータフロー
GUIのデータフロー
データフロー を グラフで表現
変更の伝播
データモデル間の伝播
データモデルから画⾯への伝播
ユーザーインプットをデータモデルに伝播
変更の伝播
データモデル間の伝播
データモデルから画⾯への伝播
ユーザーインプットをデータモデルに伝播
Wicketが標準機能でサポート
変更の伝播普通は遅延評価を使って常に最新の値がとれるようにする
Javaの⾔語機能には遅延評価はない
Wicketの標準コンポーネントにはLoadableDetacheableModelというクラスがあり、これはレンダリング時にモデルの内容を読み込むという遅延評価を⾏っている
この遅延評価を⾏うモデルをチェインして伝播を実現
遅延評価を⾏うモデルWrapperとしての利⽤例
遅延評価を⾏うモデルの例
遅延評価のメリット
Wrapperの場合、初期化時に全データをロードする
遅延評価を⾏うと表⽰に使われないデータはロードされない
制御コードを書かなくていいので可視性も向上
グラフ実装の課題と対策愚直にグラフを実装すると全貌が⾒えづらくなる
データ同⼠の関連は画⾯の要求に基づいているため、バックエンドのデータモデルと乖離
MVVMパターンを適⽤しバックエンドのデータモデルをそのまま利⽤。
⼀部のケースではEventを併⽤
実現できたこと
ViewとModelの⾃然な分離
⾃律的なComponentの実装
全てのComponent階層で再利⽤可能
簡潔でトレーサビリティの⾼いコード
終わり
追加のTopic
Wicketの Pros/Cons快適にオブジェクト指向プログラミングできる
デフォルトでオンメモリキャッシュが効いているようなものなので速い
スケール/Continuous Deliveryしずらい
起源が古くAjaxやEventは後付けの設計
ドキュメントやサンプルコードは古いスタイルの物が多い
デフォルトの設定も昔の常識に沿ったままなのでいろいろ設定が必要
Wicketʼs request processing is delicate monster…
Wicketのスケールアウト
ステイトフルなのでsession情報を共有が必要
スケールしようとするとステイトフルだったメリットがデメリットになって襲いかかってくる
UZABASEではSessionサーバーをnettyベースで⾃作
Eventを使うケース
Ajaxによって再描画するコンポーネントをAjaxRequestTargetにAddする時
特定のアクションがあった時だけ評価式が変わる 時(グラフの構造が変わる)
Wicketの⼈気は?
Wicketの⼈気は?
wicketには、英語では「⼩さな⾨」「(銀⾏などの)格⼦窓⼝」の意味の他、クリケットで使⽤される「3本の杭と、杭の上部に2本の横⽊を乗せた柱状のもの」(三柱⾨)の意味がある。Wikipediaより
Wicketの⼈気は?
Wicketの⼈気は?
察してください
終わり