こんにちは、Pharo コースの
今回の講義では、もう 2 つのトピックを
掘り下げていきます。
TinyBlog 演習では 今回やる内容を使うことになるでしょう。
1つ目は、データを記述することで どんなウェブ開発が可能になるか。
2つ目は、Seaside が REST を どう扱うかについてです。
Seaside は Pharo での REST 向けの フレームワークの1つです。
では 1 つめの題材から始めましょう。
Magritte はデータを一旦記述したら
そのデータから数個のオブジェクトを生成できる
という仮説に基いたフレームワークです。
例えば、ウェブフォームやグラフィカルな インターフェイスです。
このコースでは特に
Seaside コンポーネントを生成する方法をお見せます。
より速くウェブアプリケーションを開発できるでしょう。
例として Address（住所）クラスを使います。
スイス式の住所では
住所は、通り(street)と地域(place)と
郵便番号(plz)と 州(canton)で定義されます。
ここにある通りを示すインスタンスがあります。
ここまでは、標準的なプログラミングです。
さて、Magritte では
クラスのフィールドを記述します。
文字列を、通りの名前として定義します。
郵便番号の記述はより興味深いです。
まず、郵便番号なしでは
住所は無効だと定義しています。
郵便番号のない住所は無効なのです。
そしてスイスの郵便番号は 1000から9999までの数字です。
このことが NumberDescription で 規定されています。
この情報を
フォームの自動バリデーションに使います。
地域(Place)も必須項目です。
さらに、スイスには 26の州があります。
州はリストされるものなので SingleOptionDescription を使います。
これも必須項目です。 選択肢は順序付けられて並べられます。
なので、選択肢のリストは26項目になります。
以上のことをしたら
Magritte で何ができるのでしょう？
ここに Pharo での住所の記述があります。
descriptionStreet を StringDescription として定義します。
これこれのラベルや優先順位で。
番地については NumberDescription で定義します。
別の優先順位を付けて ラベルも付けます。
required（必須）として 最小値と最大値を与えます。
この記述を使って最初にできることは
住所を読み取る簡単なプログラムを書いて
その結果を生成することです。
住所を受け取って
それをこのプログラムに渡します。
プログラムが簡単なレポートを生成します。
通りの名前
地域は Bern 州は Bern
郵便番号は 3012。
これでデータが記述されて
レポートを生成できました。
これは最も単純なものです。
Seaside を使ってもっと 例えばコンポーネントを作るなど
もっと複雑なことをやってみましょう。
ここで言っていることは
Address オブジェクトを
この部分を生成するコンポーネントします。
「Save」と「Cancel」が付いた バリデーションフォームを追加します。
そしてそれを表示する「call」コマンドを書きます。
見ての通り、これをするのに Seaside の DSL すら使っていません。
記述することで、ウェブコンポーネントが 自動的に生成されます。
これは強力です！
ここに Quuve のスクリーンショットがあります。
Quuve は ポートフォリオ管理プラットフォームです。
表示全体が Seaside と Magritte でできています。
レポートは全て自動的に生成されています。
これによって生産性が著しく向上しています。
このコースでは
データを記述することで何ができるか の直感を示しています。
特にウェブコンポーネントの 自動生成について。
TinyBlog でそれをすることになります。
では、 Seaside の REST レイヤーで 何ができるかをお見せしましょう。
視覚的なコンポーネントなしでの クライアント・サーバー通信を可能にします。
REST は Seaside に 綺麗に統合されています。
ドメインオブジェクトをアノテーションします。
URL のパラメータと Smalltalk (Pharo) メソッドの
自然な変換をします。
複雑性に対しては
フィルター (filter) を定義します。
TinyBlog Restful Filter は
WARestful のサブクラスですが まあそれは本質ではありません。
重要なのは、アプリケーションを作る時に ここに追加するフィルターです。
演習で見ることになります。
さて、TinyBlog サーバー上の 全てのブログを得ることを
考えてみましょう。
これがそのやり方です。
まず、RestfulFilterクラスに メソッドを定義します。
listAllというメソッドです。
そのメソッドはアンカーに対応します。
REST プロトコルから GET することで
JSON 形式の文字列を生成します。
Pharo の文字列ストリームを作って
ストリームにそこにある全てのブログを格納します。
それぞれのブログについて イテレーターを使って
それぞれのブログを JavaScript に変換して
コンマで区切ります。
これで欲しかったものが手に入ります。
では、もう少し高度なことを してみたいと思います。
タイトルでブログを検索したいとします。
ここで、例えば post を使うことができます。
このブログが欲しいといって タイトルを与えます。
タイトルを引数とする post メソッドを定義します。
path も併せて使います。
URL が http…post/
ときて、さらに何かがくると それがタイトルです。
この中括弧の内側の部分です。
JSON形式のテキストを生成します。
そして TinyBlog の機能を呼び出します。
この引数で示されたタイトルのポストはありますか？ と問い合わせます。
もしなければ、エラーを返します。
あるならば、それをストリームに入れて JSONにします。
できることは沢山あります。
検索をするのなら 同じやり方でできます。
URLのところに
search?title= と入力すると 自動的にマッチします。
タイトルがここにあります。
こうやって Seaside で REST を することができます。
Seaside でグラフィカルなコンポーネントと
ドメインの機能を
REST API で提供することができます。
GET のみをお見せしましたが
他の REST の機能も利用可能です。
Delete、Post、Get、など。
また、Seaside と Magritte を 組み合わせる方法も見せました。
Magritte は強力なフォームを 自動的に生成します。
そして、REST も良く統合されています。
REST をするために Teapot を 使う人もよくいます。
Teapot は Zinc の上位レイヤーで REST のプロトタイプをすることができます。
REST API を動作させる方法を見つけるのに 手っ取り早い方法です。
楽しんでみてください。
Web Enterprise 本に ドキュメントがあります。