yojikのlog

yojikのブログです

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を利用するライブラリが存在する
P.S. そんなに活用している「継続」ですが、将来廃止される予定です!!

継続は実装的に複雑すぎるわりにSeasideの本質では無いだろうということで、廃止になる予定らしいです。思いっきりがいいなぁ。

2.いろいろ発表会

力尽きたので、あとで書く。。

3.飲み会

いろいろ。
あと Alan Kay 講演で出てきた Golden Box の実装系?は Pepsi and Coke という名前らしい。Lisp + Smalltalkみたいな文法らしいです。大島さんの日記をよく読めとのこと。

あとで書く。。

*1:CSSSmalltalkで書かず、普通のCSSで記述する

*2:これはブックマーク対応としては微妙そうなんだけどね。。