月曜日, 7月 07, 2008

【EC開発体験記-View-】 ワンソースマルチビューを実現する このエントリーを含むはてなブックマーク


 Reflexフレームワークの真骨頂はViewである。Reflexは、ブラウザ、携帯、Flex2、PDFなど様々なViewに対して、同じEntityを与えさえすれば、同じように表示させることを目標とする。以前にも述べたが、1つのEntityから複数の写像をとれるという意味で、名前をReflex(写像)とした。これをワンソース・マルチビューというらしい。(xfy by ジャストシステムさん)
 本来は、EntityをマッシュアップするControlerがViewからの参照元なので、ControlerはViewを元に設計すればよいことになる。さらには、EntityもViewを意識することで、Viewのイメージを崩すことなく一貫して扱えるようになるので、このような設計を心がけるべきだろう。実際に私たちがプロジェクトで構築したシステムにおいては、理想とはいえないものの、一貫したEntityの利用が一応できている。例えば、Flex2のカートから受注プロバイダにXML送信された受注(Entity)は、管理画面のPHPからJSONリクエストで呼ばれることもあれば、納品書PDFとして出力されることもある。否定の3.を参照。
3.各サブシステムで共通のエンティティを使用(最小単位は1品1葉1レコード)

 それでも理想といえないのは、統一したレンダリング方法がないからである。一つのテンプレートを作成するだけで、Flex2やPDFなどの様々な表現に対応させたかったのだが、そこまではできておらず、それぞれのViewに応じた実装とスキルが必要であった。
 そこで、現在開発中のReflex Template(コードネームv:lex)では、XHTMLによるテンプレートを一つ作成するだけで様々な表現ができるようにした。考え方としては、下図のように、EXCELのようなスプレッドシートのイメージでViewを設計し、1枚のシートをdocument、ページをpage/tab、表をtableとして配置していく。tableはページに何個でも置くことができ、位置も細かく指定できる。なお、表題などの文章や画像などは1マスの表とする。
 Templateは動的に選択でき自由に画面遷移できる。また、TABを利用することで、遷移なし(ページ読込なし)に異なる画面を表示させることができる。セッションという考えはなく、Entityにデータを保存する。つまり、Entityはグローバルであり共有データとしても使う。Entityを与えてBlogicを実行するが、BlogicはクライアントJavaScriptでも、サーバのサービスでもどちらにあってもよい。



 また、以下のような5階層のレイヤーをもち、Template Engineによって各層が組み立てられる。


<Template Engineの機能>

1.Templateを選択する機能
- page id(xxxx.html#001)で指定
2.サーバからEntityを取得しBlogicを実行する
- Entityをチェックしてエラーコードをセットする。その後はAttributeによってエラーが表示される
- エラーがなければBlogicを実行する
3.静的なtemplateの上に動的なEntityをマッピングする。その際、Attributeにより値をフォーマットする(カンマを付けたり色を付けるなど)
4.データ入力時にvalidatorを実行する
5.(エラーが含まれていなければ)Entityをサーバに送信する


 一つだけ注意すべきことがある。それは、Entityへのデータ入力点(この場合、サーバから取得した時点とキー入力の時点)におけるエラーチェックを厳密にすることだ。キー入力の時点では、Validatorとして古くからJavaScriptは一般的に使用されてきたが、サーバから読込んだ時点というのは意外な方も多いだろう。この設計では、ここをチェックしないとハングする場合もあるので要注意だ。というわけで、否定の16はやはり間違いであった。

16.入力は寛大に受け付け、出力は厳しくせよ

 なお、Blogicにおいてエラーとなった場合には、エラーコードをスタックして返すようにする。エラーコードの種類により、Alertを出したり、色を変えたりするのはValidatorではなく、Attributeの責務である。
 詳細は完成してから発表したい。乞うご期待。

0 件のコメント:

 
© 2006-2015 Virtual Technology
当サイトではGoogle Analyticsを使ってウェブサイトのトラフィック情報を収集しています。詳しくは、プライバシーポリシーを参照してください。