[IM] コンテキストを実体化する改良

4月からずっと、ちょっとずつ、INTER-Mediatorを改良してきました。内部の構造については別記事にまとめる予定です。

INTER-Mediatorでは「コンテキスト」という概念を、データソースつまりデータベースから得られる結果に当てはめています。単にテーブルということではなく、テーブルから得られた列構造を持つレコードの集合を「コンテキスト」として位置づけています。たとえば、住所録から「会社関係」「親戚関係」といった分類をして取り出すとすると、それは住所録テーブルから得られるものではありますが、列構造を持つレコード群が、意味を持ちます。そうした意味付けされてデータベースから取り出された結果をコンテキストと読んでいます。システムのアーキテクチャとして、DCI(Data, Context and Interaction)という手法が提唱されていたりしますが、そこでのコンテキストと同じ意味です。この考え方は別に新しいものではなく、FileMakerなどでも見られる概念です。ただ、コンテキストと抽象的に説明すると分かりにくくなり、一方で「検索条件を適用したテーブルアクセス結果」というとあまりに陳腐な感じになってしまい、とらえどころのない用語でもあります。

これまでのINTER-Mediatorでは、コンテキストは「定義する」ものでした。定義ファイル(.phpファイル)で、どのテーブルあるいはビューであり、主キーは何で、検索条件やソート条件は何でと言ったいちれんの設定を「コンテキスト」と読んでいました、この定義ファイルにあるコンテキストに名前をつけて、その名前をページファイル(.htmlファイル)側から参照します。シンプルに説明するときには、ページファイルにテーブル名とフィールド名を書けば、その要素とフィールドがバインドして、データを表示し修正すれば書き直しができるという言い方をします。しかしながら、正確には、コンテキストとして意味付けされた一連の列構造を持つレコード群を、ページ上に展開するということです。従って、同じテーブルから一覧表を作る場合と、単一のレコードを示す場合では、目的が違うので、「異なるコンテキストを要求している」と見なして、定義ファイルに別々のコンテキストを記述するというのが原則と考えています。

定義ファイルに記述した、コンテキストの仕様に相当する者は、「コンテキスト定義」と呼ぶ事にします。

一方、このコンテキストに従った動作をするために、内部的には明確な形でオブジェクトを作っていませんでしたが、それを実現しました。内部的なコンテキストは、クライアントのブラウザ内でオブジェクトとして存在し、一つの見方はデータベースの内容のプロキシです。データベースの内容は、コンテキストのオブジェクト内に「再現」されていると考えてください。加えて、コンテキスト内のデータと、ページ上の要素あるいはその属性との間でのバインドが実現されており、たとえばテキストフィールドでデータを修正すれば、コンテキストオブジェクトの関連したデータも更新されることを自動的に行えるようにしました。

ただし、ここで、内部的なコンテキストは、JavaScriptからタッチすることは可能で、プログラマに対して解放されているとも言えますが、一方で、INTER-Mediatorはそうした手続き的なプログラミングを必要としなくても多くの目的をまかなえるように作りたいことがあります。本来、こうしたバインドの実装は、厳密な意味ではオブザーバブルな実装が必要になりますが、まずは、メソッドベースでの実装を行うことにしました。従って、オブザーバとオブザーバブルは明確になっていない実装になり、そうした仕組みの拡張については今後の課題と考えています。現状は、コンテキストのオブジェクトのメソッドを使って値を設定すれば、同じレコードの同じフィールドの結果を表示している他の要素にも変更結果が伝わるという状態にしてあり、スタティックな意味でオブザーバブルになっています。

こうした内部的にコンテキストを持つことに対して、データベースと連動しない「ローカルコンテキスト」も実装しました。ローカルコンテキストは、ターゲット指定でのコンテキスト名に「_」を使い、フィールド名は自由に使います。次のような2つのテキストフィールドを用意します。そして、INTERMediator.construct(true); を実行します。すると、一方に入力してタブキーでchangeイベントを発生させると、他方のテキストフィルドに入力したデータがコピーされます。連動させるためのプログラムの作成は必要ありません。

<input id="tf1" type="text" data-im="_@feeling" />
<input id="tf2" type="text" data-im="_@feeling" />

このローカルコンテキストは、FileMakerで言えば、グローバルフィールドのようなものです。また、ターゲット指定からそのテキストフィールドの値を取り出すメソッドも用意しているので、他の機能との統合を行うときにも気軽に利用できます。以下のように、IMLibLocalContextで参照されるオブジェクトでローカルコンテキストは実現されており、getValueメソッドで引数にターゲット指定のフィールド名のみを指定することで、テキストフィールドの値を取り出すことができます。

var inputValue = IMLibLocalContext.getValue("feeling");

ローカルコンテキストはクッキーに記録されるような動作を考えました。たとえば、検索条件をテキストフィールドに入れていれば、別のページから戻って来たときにも元の検索条件を覚えているような動作を自動化させたいからです。ただし、この動作については、おそらくさまざまな要求が実際の開発では発生すると思われるので、ぜひとも使ってみた意見をいただきたいです。

ページナビゲーションの「更新」ボタンをクリックすると、このローカルコンテキストのクッキーによるキャッシュをクリアします。