Reactive programming with Apache Wicket

Post on 07-Jan-2017

1.193 views 4 download

Transcript of Reactive programming with Apache Wicket

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の⼈気は?

察してください

終わり