2008-04-24-02-【Scrooge】データ構造 - 7 - project-enigma

2008-04-24-02-【Scrooge】データ構造 - 7

>> Site top >> weblog >> 月別アーカイブ >> 2008年04月のlog >> 2008-04-24-02-【Scrooge】データ構造 - 7

最終更新日付:2013/12/31 07:36:58


【Scrooge】データ構造 - 7

2008 年 04 月 24 日

正直なところ、この weblog で順序立てて Scrooge の話を進めていくのがツラい。Scrooge クラスのアプリケーションであれば、これまでは「本能に任せて」書いてしまっていたからだ。とにかく作って、修正を加えていく。それでコントロールを失わずにやりおおせるのであれば、その方が楽だったりする。時間的な理由で、この一連のエントリを定期的にアップするだけで精一杯なので、並行して実装に取り組むことができない。そうするとここに書くことが「頭の中だけで組み立てたこと」になってしまう。つまり、足元が怪しいのだ...と、愚痴を書いたところで続きにとりかかろう。

今回は、これまでと違うアプローチでデータ構造を考える。前回までは構造に着目してやって来た(それとていい加減なものだった)が、今回は振舞いを中心に据えて考えてみたい。

振舞いを中心に、とはどういうことか。つまり、画面操作のイベント処理を基点として考えて行く、ということだ。細かい話はひとまず抜きにして、まず店舗ビューで特定の店舗が選択された状況を考えてみよう。

テーブルであれリストであれ、大抵の場合は内容の描画にはハンドラを登録しておく方法をとる。つまり、フォームがオープンされた時に関数ポインタを API に渡しておき、必要な時に Palm OS が「何行目の何列目を描画せよ」といってコールバックしてくるわけだ。店舗ビューでは、画面上のテーブルに表示されるのは商品一覧だ。その店舗で価格を登録されているものもいないものも、とにかく表示する。ただし、順番は「他店舗との比較において低価格なもの」順だ。売価が登録されていないものは最後に表示される。

さて、アプリケーションたる Scrooge としては、API からコールバックされてきた時のためになんらかのデータ構造をヒープ上に持っておかなければならないだろう...という考えを否定するのがこのエントリの目的だ。そのデータ構造は、すでに Palm OS データベースとしてデータベースヒープに存在するのである。つまり、ItemDB である。

しかし、以前話題に上った時、ItemDB は商品名を格納するだけのものだったはずだ。であれば、画面表示に使用する情報の全てを格納してはいない。そのとおり。だから ItemDB はランタイムデータ構造にふさわしい内容に変身してもらわなければ困る。テーブル上には商品名、価格、最低価格からの差額などが表示される。商品名自体は ItemDB にある。それ以外はコンテキスト依存だ。つまり、画面右上のポップアップリストでどの店舗が選択されているか、それによって PriceDB のどのレコードを参照すべきかが決まる。つまり、ItemDB の各レコードは PriceDB への参照を保有し、この値をランタイムに変化させることになる。この値が変化するのはポップアップリストで商品を選択した時点だ。売価が設定されていない組み合わせでは、PriceDB への参照は未設定となる。そして、この参照値が更新される(つまり別店舗を選択する)たびに、ItemDB はソートされることになる。それは当然必要なことだ。ItemDB はそれ自体がテーブル描画のためのランタイムデータ構造なのだから。

まったく同じことが、商品ビューでテーブルに店舗一覧を表示する場合にも言える。その場合は、上記の構造で ItemDB のかわりに ShopDB が使われる。PriceDB の設計を少し工夫してやれば、処理を統一することも簡単だろう。つまり、アプリケーションたる Scrooge としては、3つのデータベースのハンドルと「キーデータベースのハンドル」だけを持っていれば良い。あとは全てデータベースヒープ上でカタをつけられる...というか、Scrooge の目的は実はそれなのだ。Japonica ではダイナミックヒープを使い過ぎてしまったので、Palm OS らしいアプリケーション設計に慣れようという意図があったのである。

というわけで、長くなってしまったので詳細は明日以降。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : Palm

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.