日本語 · English(未訳)

ドメインモデルと不変条件

現在確定しているドメインモデル・不変条件・時刻境界をまとめる。ADR が決定の履歴(不変・追記型)であるのに対し、 本書は現在の姿(上書き型)を示す。判断の根拠は各 ADR を参照。

1. premise(ユビキタス言語の中核概念)

premise とは、ある式・節・句の解釈が成立するための先行条件の総称である。具体的には、暦法 (calendar-system)、軸、カレンダー、ロール規約、粒度、TZ、asof、WKST、出所(source)を含む。契約の前文 (recitals)が以降の条項の立つ前提を先に据えるのと同じ役割を、式に対して果たす(ADR-16)。

2. 構成要素(DDD 語彙)

2.1 基底 Chronos(値オブジェクト・不変の土台)

TZ 非依存の単一絶対連続時間軸(うるう秒を持たない一様な理想化尺度=UTC の各日をちょうど 86,400 秒と数える。ADR-33)。TZ は chronos から市民座標への 版付き写像で、premise 相対の射影パラメータ(「錨」は基底でなく射影に付く。ADR-33)。全ての暦法・粒度は ここへの射影。相対化しない(ADR-09・ADR-10)。言語名 Kairos(基底から選ぶ意味ある時点)に対し、この連続基底を Chronos と呼ぶ。言語は Chronos から kairos の集合を 紡ぐところまでを担い、その集合を解釈して実際に発報するのは実装系(Chronos 上の実行)。

2.2 暦法 CalendarSystem(エンティティ)

基底上の入れ子の窓分割定義の集合。グレゴリオ暦も名前を持つ一インスタンスで標準ライブラリ同梱。差し替え可能 (ADR-07)。原始的定義と派生的定義がある(ADR-19)。原始的定義は窓生成語(一様分割 grid・可変集約 span・ 可変分割 split・並列ラベル cycle)で軸を刻む。依存はボトムアップ集約を主とし(原子 daymonth に、 monthyear に束ねる。month が基本の括り)、year の従属窓(quarter)だけを split で割って year に 自動追従させる。ブロック top-level の束縛を公開語(Gregorian.monthmonthStart 等)として持つ(30-syntax §1.11)。閏(2 月の 28/29)は year というへの依存ではなく month 序数から算出する依存で、これゆえ monthyear 非依存に置け、派生で year を組み替えても循環しない。派生的定義は Base with { … }premise → premise 閉包)で base の公開語を上書きする。裸名は派生スコープで再解決し依存語は自動追従、 Base.word の修飾参照は base 値にピンする(機構 A・ADR-17。30-syntax §1.12)。派生が動かすのは窓の切れ目だけで 暦日は不動(解釈 P・基底固定 I1)。会計暦=Gregorianyearmonth span 12 phase: 3 に組み替えるだけの 一行(quarter は自動追従。ピン・循環回避は不要)。

Gregorian は理想化された連続時間軸上の数学的モデルであり、歴史的事実(1582 年改暦の日付消失・重複、地域差、 うるう秒(正負とも。ADR-33)、暦の有効範囲)は負わない。それらは暦法純粋(ADR-20)の生成規則が背負う層ではなく、必要なら別 premise(歴史考証版)や asof/source 注釈で扱う(スコープ外。90-open-questions)。

2.3 窓 Window(値オブジェクト・二種)

軸を余さず分割するパーティション型と、マーカーで切る区間列型。保証する性質(網羅か否か)で型を分ける(ADR-08)。

2.4 粒度 Granularity(表示射影)

年・月・日・時・分・秒・週・四半期・カスタム。軸上の位置の表示形式であり、型には乗せない(ADR-11)。

2.5 時間ストリーム TemporalStream(値オブジェクト)

遅延・無限・順序付きの、基底上の点の列。同じ定義なら等価。本体層の唯一の第一級の値(ADR-04・ADR-05)。 外延(生成された点の列)であり、内包(生成規則=premise)とは別の型(ADR-18)。旧称 DateStream から改名。

2.6 カレンダー Calendar(エンティティ/集約ルート)

「東京決済カレンダー」のように名前で参照される。週末方針 → 法定祝日 → 組織休日/特別営業日のカスケードを 束ねる。asof で版が決まる。実体は「名前を付けてキャッシュした一本のストリーム式」であり特別な機構ではない (ADR-01・ADR-04)。横方向に和・積で合成可能(JointCalendar 相当)。

注意: 取引所カレンダー(例: TSE=東証)は「国の祝日」とは一致しない。祝日は premise の一層、TSE はその層に 組織固有の休場(年末年始等)を重ねた完成品のカレンダー。両者は別物。

2.7 演算子(ユビキタス言語の動詞)— core 族

本体層の core 族。糖衣(monthEndbusinessDaysnextWeekday 等)は core への展開で定義される(ADR-23)。 糖衣の定義は専用構文を持たず、既存の束縛 = の右辺に core のパイプ列を書く(前段はラムダ s => 明示、素直なら 省くポイントフリー略記。宣言印なし。30-syntax §1.13)。

2.8 ロール規約(軸非依存の演算子修飾)

Following / Preceding と、上位窓を引数に取る Modified 修飾。営業日にも DST にも同じ体系が乗る(ADR-13・ADR-14)。

2.9 二層構造と型

言語は premise 層(暦法・カレンダーを組み立てる。多行・宣言的可)と本体層(スケジュールを紡ぐ。一行・パイプ的)の 二層で、SQL の DDL/DML に対応(ADR-18)。両層は同じストリーム語彙を共有するが型は分かれる。

両層は非対称の関係。premise を評価すると時間ストリームが出る(逆は不可)。加えて境界に一本の管があり、基底座標 (asof・TZ・粒度スケール・データ位相)が premise を確定する(ADR-19/26)。

3. 不変条件

4. 時刻に関する境界