« 気絶、および昆虫綱ゴキブリ目との戦闘 | メイン | Zen of Palm との格闘 »
2008年04月30日
【Scrooge】データ構造 - 9
今日はあまり時間がないので、小さなトピックについて。PriceDB の「詳細情報」についてだ。一昨日の図をもう一度見てみよう。

詳細情報とは、割引きイベントがある場合に使用されるものだ。問題は、これが可変長のデータになってしまうということだ。4月に入ったばかりの頃の画面イメージをもう一度。


割引イベントの種類は、「なし」か「週単位」か「月単位」のいずれかとなる(そう、年単位はやめようと思っている)。この3択の列挙子は詳細情報の先頭にあるべきだ。しかし、そこから先は状況によりけり、ということになる。
とりあえず、この3択を表現する列挙子を作ってみよう。そして割引きの種類(円または%か)もついでに。
enum DiscountSchedule {
DISCOUNT_NONE = 0,
DISCOUNT_WEEKLY = 1,
DISCOUNT_MONTHLY = 2
};
enum DiscountType {
DISCOUNT_YEN = 0,
DISCOUNT_PERCENT = 1
};
で、いささか乱暴だが週指定の割引きを以下のようにしておく。
struct WeeklyDiscountInfo {
UInt16 interval;
bool dayofweek[7];
UInt16 discount;
DiscountType type;
};
月指定は以下のようになる。
struct MonthlyDiscountInfo {
UInt16 discount;
DiscountType type;
char dateList[1];
};
構造体の最後に長さ1の char 配列を置くのはよく使われるテクニックで、必要な文字列分を余計にアロケートすることで、構造体の後ろに文字列バッファを置くことができるというものだ。これは Palm OS データベースの場合だって使える。
...時間切れ。続きは明日以降。
投稿者 kagelow : 2008年04月30日 23:00