タイトル倉橋浩一のWebObjects Practice》再利用可能なコンポーネントで“台紙に埋め込む”(2)カテゴリーWebObjects, 倉橋浩一のWebObjects Practice
作成日2001/10/31 16:57:12作成者新居雅行
(2) 複雑なページの個別の要素を隠ぺいする
繰り返し使用には明確なメリットがあります。ですが、一度しか使わない埋め込みコンポーネントでも、例えば非常に項目数が多くてデザインも複雑なページで個別の要素を隠ぺいするために使ったりすると、十分メリットがあると思います。

私はある顧客のために、Webによる購買システムを作りましたが、このシステムでは一画面に200以上のエレメントが配置されることもあり、そのために10個程度のEntityや50ものAction関数を使ったりします(Webアプリの常識としては、そんなにたくさんのエレメントを一つの画面、少なくとも単一のFORMの上に配置するのは得策ではありません。しかし、端末操作に慣れた事務部門のユーザから、「Submitした後や再表示で少し待つことになっても、TABと数字キーだけで一度にたくさん入力/表示できるほうがいい」、という要望があったため、このような仕様としています)。これをそのまま単一のコンポーネントとして実装すると、WOBuilderでコンポーネントを開くのに何秒もかかってしまいますし、クラスブラウザ上でバインドしたいAction関数を見つけだすだけでも大変です。

こういう場合には、デザイン上の要素ごと、あるいは入力/表示に使用するEntityごとに埋め込みコンポーネントにしてしまい、台紙コンポーネントには埋め込みコンポーネントがパラパラと素っ気なく並んでいるだけ、という構成にしてしまいます。そして、台紙では他のページとのNavigationやediting contextの管理、各埋め込みコンポーネントとの協調を主な仕事とし、埋め込みコンポーネントごとに入力チェックとエラー表示などを分担させることによって、view(見た目)とcontrol(制御)を融合させることができます。

また、例えば相手の頭文字かコード番号を入力するとそれにマッチする取引先をWOPopupButton上に一覧表示させて、選択した結果を台紙コンポーネントに引き渡すというような埋め込みコンポーネントを作ってしまえば、WOPopupButtonに使用するlistやitemは台紙コンポーネントからは隠ぺいすることができ、単にselectionの対象となるeoだけを設定してやればいいので、台紙コンポーネントがさらにすっきりすることになります。

欠点としては、埋め込みコンポーネントそのものは、どんなに凝ったデザインをしたとしても、台紙コンポーネント上には一つのオブジェクトとして表示されるだけなので、全体としてどのようなものになるかをWOBuilder上で確認することができなくなる、という点が上げられると思います。そのため、デザイン性を重視したページで埋め込みコンポーネントを使うには、最初に全体をスタティックなhtmlで作ってしまって、その後から、各部分を切り取って埋め込みコンポーネントにしていく、という手順で作業を進める必要があります。

□その他
埋め込みコンポーネントと台紙コンポーネントとの間のデータ受け渡しにはAPIで定義したkeyを使いますが、それとは別に埋め込みコンポーネントから台紙コンポーネントのメソッドなどを呼び出したいことがあります。この場合は、parent()を使います。parent()を埋め込みコンポーネントで使うと、その台紙コンポーネントのオブジェクトを得ることができます。もちろん得られるのはWOComponentクラスのインスタンスなので、台紙コンポーネント上に実装したメソッドなどを呼び出すためには、そのクラスへのキャストが必要になります。

ところが、3つの台紙A, B, Cの上で埋め込みコンポーネントを使っていて、それぞれにあるactionNextPage()を呼び出したい場合には、そのままでは埋め込みコンポーネントの側でA, B, Cごとにキャストを用意して呼び出してやらなければなりません。これはちょっと美しくないですよね。こういう場合のテクニックとしては、A, B, Cに共通したスーパークラスX(仮名)を用意します。つまり、WOComponentからXを派生し、XからそれぞれA, B, Cを派生します。こうすれば、parent()から帰ってくるWOComponentに(X)でキャストをかけてやることにより、無事共通のメソッドを呼び出すことができるようになります。このように、WOComponentと実装クラスの間に一つクラスを挟むことで、さらにソースの見通しがよくなり、保守性/生産性が高くなります。

どうぞお試し下さいませ。
[倉橋浩一/テクニカル・ピット]
関連リンクWebObjectsのページ