« 気絶、および昆虫綱ゴキブリ目との戦闘 | メイン | Zen of Palm との格闘 »

2008年04月30日

【Scrooge】データ構造 - 9

 今日はあまり時間がないので、小さなトピックについて。PriceDB の「詳細情報」についてだ。一昨日の図をもう一度見てみよう。

2008042801.gif

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

2008040301.gif

2008040201.gif

 割引イベントの種類は、「なし」か「週単位」か「月単位」のいずれかとなる(そう、年単位はやめようと思っている)。この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



kagelow home へ