Squeakers' Night in 未来パーティ 2.0
http://swikis.ddo.jp/umejava/38
以下ちょくちょく修正中です!
1.梅澤さんのSeasideチュートリアル
ここでチュートリアルのセットがダウンロードできます。
チュートリアル内容は、上でフォローできるので、気になったところメモです。
SeasideはなんちゃってMVCでは無い
なんちゃってMVC(←梅澤さん命名)では、View層はHTMLテンプレート、コントローラは関数の集合体、Viewはデータにすぎない。これではMVCのパワーを活かすことができない。
Seasideでは、VとCは一体型になっていて、しかも組み合わせることができるコンポーネントである。そしてModelは普通のオブジェクト(POSO?)である。
Seasideはテンプテート言語を使わない
HTML書くのめんどくさくない? なれた環境でデバッグしたくない? プログラム言語自体がもつ機能をつかって、共通化したり、ユーティリティを使ったりしたくない?
実は開発者が本当に扱いやすいのはプログラム言語である。Smalltalk使いならSmalltalkで普通に画面組み立てのロジックを記述すればいい。
プログラマと画面デザイナの分業はどうするの? という意見が出そうだが、デザイナはCSSを書けばいいじゃん! という発想みたい。*1
具体的には、コンポーネントのrenderContentOnというメソッドをオーバーライドする。ブロックをフル活用する。
MyComponent>>renderContentOn: html html orderedList: [ #(foo bar) do: [:each | html listItem: [ html text: each]]].
感想:
おそらく、Smalltalkならばこれは正解の一つだろう。
Seasideは真のコンポーネント指向である
Seasideのコンポーネント(V+Cが一体化した部品)は、HTMLページに単純対応しているわけではなくて、GUIコンポーネントのようなものである
他のコンポーネントに埋め込んだり、他のコンポーネントのルートアプリケーションとして設定することができる。
単体でレンダリングされたときも、他のコンポーネントに埋め込まれてレンダリングされたときも、コンポーネントはそれなりに描画される(ヘッダフッタとか)
感想:
コンポーネントをつくってテストして、他のコンポーネントと組み合わせてアプリを作っていくことができる。地味だけどすばらしい考え方だと思う。オブジェクト指向の本来のパワーは部品をつくり、組み立てることから生まれる。これは基本的なんだけどフォローできてないことが多いよね。
モデルとGUI部品のバインド
例えばcustomerがコンポーネントのインスタンス変数として定義されていれば、以下のようにおこなう。
html form: [ html textInput on: #name of: customer. html textInput on: #address of: customer. html submitButton. ]
簡単!
call and answer を利用したページ遷移
別のコンポーネント(ページでもいいけど)に制御を移すときには、callをつかう。呼び出された側でanswerを呼び出すと、callの直後に戻ることもできる。継続がイカス。
A>>methodA value ← self call: (B new) B>>methodB self answer: value
Sesaideの状態管理機構
コンポーネントに定義されたインスタンス変数の情報は、セッションスコープのコンテキストに属するものとして状態管理される。セッションへのデータ保存や、セッションからのデータ取得は自動的に行われる。
さらにSeasideでは継続を利用して完全な「ブラウザの戻る」対応をおこなう。
self session registerObjectForBacktracking: object.
このようにセッションにオブジェクトを登録すると、ユーザが何かするたびに履歴情報が保存されていく。「戻る」とその情報も巻き戻される。たとえばカウンターアプリなら、カウントアップしたあと「戻る」と内部でカウントダウンされる。
Webアプリにユーザビリティの高いundo機能を実装できるすごい機能だけど、どこに使うかは結構設計判断が必要らしい(by umezawaさん)
継続のステップの記録は毎回オブジェクトをコピーしておく(シャローコピー?)というやや富豪的プログラミングらしいので。
ちなみに実装面の補足:
セッションと継続を補足するために、URLにセッション識別用のキーと、継続識別用のキーを埋め込む。*2
その他
- ワークフロー的な動作にはWATaskをつかって対応する。これにより継続を使った対話の区切りを表現する。
- ブロックと継続を利用する。ごめんなさい。ちょっと後半駆け足だったため、うまくフォローできず。
- DBとの接続管理は、Sessionオブジェクトをオーバーライドして実装する(必要あり)。
- Ajax用としてScriptaculousを利用するライブラリが存在する
- Smalltalkでロジックを書くとJavaScriptに変換されるような仕組み
P.S. そんなに活用している「継続」ですが、将来廃止される予定です!!
継続は実装的に複雑すぎるわりにSeasideの本質では無いだろうということで、廃止になる予定らしいです。思いっきりがいいなぁ。
2.いろいろ発表会
力尽きたので、あとで書く。。