静的モデル・ハーネス — ドメインの構造を記述する
静的モデル・ハーネスは、ドメインの概念・関係・規則をモデルとして記述し、検査と実行へ接続する基盤です。本連載の第3回では、ソフトウェア工学で実用化された構成方法を活用し、AIによる生成・変更にも業務上の制約 (Constraint)を働かせる仕組みを説明します。
静的モデル・ハーネスの位置付け
シリーズにおける位置付け
第1回ではAI開発ハーネスの全体像を、第2回ではモデル駆動開発を基盤とするモデル・ハーネスを扱いました。第3回はその静的な側面として、ソフトウェアを構成する概念、型 (Type)、同一性 (Identity)、関係、所有、制約を記述します。第4回では、同じ対象のイベント (Event)、状態遷移、ワークフローへ進みます。
静的モデルと動的モデルは、同じモデルを構造と振る舞い (Behavior)から捉える二つの側面です。ドメイン・モデル (Domain Model)とアプリケーション・モデル (Application Model)を分ける目的・関心の軸とは異なります。ドメインにも振る舞いがあり、アプリケーションにも静的な構造があります。
前回シリーズの静的モデルを引き継ぐ
前回シリーズの「モデルの構造とビュー (View)」と「構造基盤としてのオブジェクトモデリング (Object Modeling)」では、概念、型、関係、責務 (Responsibility)、制約を形式的に記述し、目的に応じたビューから確認する基盤を示しました。今回の静的モデル・ハーネスは、その構造記述を検査と実行へ接続し、AIによる生成・変更に継続的な制約を働かせるものです。
オブジェクト・モデル (Object Model)は形式的な構造を、文芸モデル (Literate Model)は意図や判断を文章として、知識モデル (Knowledge Model)は意味関係と根拠を保持します。BoK (Body of Knowledge)で管理する用語集 (Glossary)の名称、識別子 (Identifier)、定義を共有することで、三つのモデルの対応を保ちます。クラス図 (Class Diagram)などのビューは、元のモデルから目的に合った構造を選んで示します。意味の正本はモデルと用語集です。
ドメイン知識に近い抽象度で記述する
モデル駆動開発では、ソフトウェアをドメイン知識とのインピーダンス・ミスマッチが少ない形で記述します。注文、注文明細、商品、金額といった概念と、その関係や規則を直接表すことで、プログラミング言語の実装詳細へ展開する前に、業務としての意味を確認できます。
SimpleModeling (シンプルモデリング)では、CML (Cozy Modeling Language)で記述した実行可能モデル (Executable Model)をTextusが直接実行します。モデルだけでは不足する実装はAIがプログラミング言語で自動補完するため、開発者はモデルによる記述を中心に作業できます。この分担によって、モデルは開発者にとって事実上のプログラミング言語になります。補完した実装もモデルの契約に従う必要があります。
静的モデルで記述する構造
業務の対象をソフトウェアとして扱うには、対象の同一性、共通する性質、他の対象との関係を定める必要があります。静的モデルは、これらを型、分類、所有、多重度 (Multiplicity)などの形で記述します。
永続する対象と値を区別する
SimpleModelingでは、エンティティはプログラムのライフサイクル (Lifecycle)を超えて、同じ対象として存在し続ける永続オブジェクトです。状態 (State)が変化しても、その対象としての同一性を保ちます。注文は実行が終了した後も存続し、次の実行で配送先を変更しても同じ注文として扱います。この同一性をモデルに記述し、生成・変更した実装を検査する基準にします。
分類・構造・その他の関係を見渡す
オブジェクト・モデルの静的構造における関係は、分類、構造(所有)、その他の関係を基本に整理します。分類はis-a関係、構造はhas-a関係に対応します。この全体像を踏まえて、個々の関係に役割、多重度、所有やライフサイクルの条件を記述します。
分類では汎化 (Generalization)を基本に、パワータイプ (Powertype)とトレイト (Trait)で分類や共通性の表現を補います。全体と部分の構造では集約関係 (Aggregation)と合成関係 (Composition)を使い、共有と所有を区別します。それ以外の対象間の結び付きは、関連関係として役割を明示します。トレイトの合成は共通性を補う仕組みとして扱い、適用を一律にis-a関係とみなすことは避けます。
分類と共通の性質を明示する
分類と共通性の記述では、汎化を基本にします。共通する性質を上位概念にまとめ、下位概念で具体化します。SimpleModelingではプログラミング言語との相性を考慮し、汎化の階層に単一継承を採用しています。多重継承が担う機能の一部を、パワータイプによる分類軸の表現と、トレイトによる共通の部分モデルの合成で補うモデル構成です。
パワータイプは、顧客種別や商品カテゴリのような分類軸と、その軸で使用する区分を表します。単一継承による基本の分類に加えて、複数の観点から対象を分類するために利用します。分類軸ごとの意味をモデルに置き、区分の追加や実装への対応を設計します。
トレイトは、汎化の階層を横断する共通の特徴 (Feature)、責務、制約などを、再利用可能な部分モデルとして定義します。複数のクラス (Class)へこの部分モデルを合成し、多重継承が担う共通性の表現の一部を補います。プログラミング言語のtraitやinterfaceへの対応は、実現方針として定めます。
分類と全体・部分から業務の構造を捉える
業務の対象を理解するとき、「何の一種か」「何から成り立つか」は基本となる問いです。前者は対象の共通性と違いを、後者は対象を構成するまとまりを明らかにします。オブジェクト・モデルでは、この二つをis-a関係とhas-a関係として重視します。
例えば、注文は複数の注文明細から成り立ちます。注文と明細を一つのまとまりとして捉えることで、明細を追加する、数量を変える、合計金額を求めるといった業務の操作 (Operation)を、その構造に沿って考えられます。何を一つの対象として扱い、その内側に何を含めるかという判断が、モデルの骨格を作ります。
一方、明細が指す商品は、注文を構成する部分とは役割が異なります。商品は注文とは独立して管理され、多くの注文から参照されます。対象の内側に持つものと、独立した対象として関わるものを分けることで、変更や管理の責任も明確になります。
静的モデル・ハーネスは、こうして捉えた分類やまとまりをモデルに残し、AIによる実装や変更にも、その構造を保つ基準を与えます。
集約モデル・ビューモデル・表示モデル
SimpleModelingでは、エンティティや値オブジェクトを基礎に、集約モデル、ビューモデル、表示モデルを用意しています。業務上のまとまりをどう構成するか、その情報をどのような形で利用するか、利用者にどう提示するかを、それぞれ明示的なモデルとして記述します。
集約モデルは、関連するエンティティや値オブジェクトを、業務上の整合性を保つ一つのまとまりとして表すモデルです。中心となるルートと構成要素を定め、そのまとまりの状態、操作、不変条件 (Invariant)を記述します。例えば注文では、注文をルートとして注文明細をまとめ、明細の数量や金額と注文全体の合計が整合するようにします。個々のオブジェクトの関係に加えて、まとまり全体として守る規則と振る舞いを表現できます。
ビューモデルは、エンティティなどが持つ情報を、利用目的に合わせた構造へ投影するモデルです。必要な属性 (Attribute)や関連を選び、業務上の意味を保ちながら、利用する側に適した情報のまとまりを作ります。例えば注文の概要には注文番号、顧客名、合計金額を、詳細には注文明細や配送先も含めます。元のモデルと各ビューの対応を記述することで、用途ごとに必要な情報の形を定められます。
表示モデルは、ビューモデルの情報を、利用者へ提示するための構造として表すモデルです。一覧、詳細、項目のまとまり、見出し、表示する値、操作の入口などを記述します。例えば注文番号を一覧項目の見出しにし、合計金額を表示項目に、注文の詳細を開く操作を入口として構成します。業務上の項目を画面上の役割に対応付けることで、表示を担う仕組みへ渡せます。
注文という業務上のまとまりを集約モデルで捉え、注文概要や注文詳細という情報の形をビューモデルで作り、それを一覧や詳細画面として提示する構造を表示モデルで定めます。三つのモデルとその対応を明示することで、AIによる生成・変更でも、業務の規則、情報の意味、画面上の役割を保つ基準が得られます。
用途に応じたステレオタイプでエンティティを分類する
エンティティ・オブジェクト (entity object)は、業務で扱うドメイン・オブジェクト (Domain Object)を記述するために用います。ドメイン・オブジェクトには、用途や性質に応じた構造と振る舞いがあります。SimpleModelingでは、その特徴をステレオタイプとして定義します。
資源を表すResource、処理の単位を表すTaskは、エンティティ・オブジェクトをさらに分類するステレオタイプです。対象に合ったステレオタイプを選ぶことで、その用途に適した構造と振る舞いをモデルに取り込めます。資源には所有・共有・利用の条件、処理には入力・結果・必要な資源などの契約を記述し、実行方針を決める際に参照する情報を保持します。
静的モデルは、処理が利用する資源や入出力の関係を定めます。処理の開始順序、待機、再試行、終了条件は、動的モデルで記述します。
モデルをハーネスとして機能させる
実用化された概念・部品・パターンをモデルの枠組みとして活用し、その規則を処理系の検査と実行へ接続します。AIによる生成・変更に制約を働かせ、静的検査、実行時検査、意味のレビューを組み合わせて、ユースケース (Use Case)との対応を確認します。
モデルの検査と実行を開発工程に組み込む
エンタープライズ・アプリケーション分野では、ソフトウェア工学の長い蓄積を通じて、多くの概念、部品、パターンが実用化されてきました。SimpleModelingは、これらをモデルとして記述し、そのまま実行できる基盤を提供します。
CMLはモデルの要素と構造を文法として定めます。処理系はその記述を読み、対応する検査を行い、Textusは実行可能モデルを直接実行します。AIが生成・変更したモデルと補完実装をこの経路に通すことで、モデルの契約に反する成果物を開発・実行の境界で検出できるようにします。この仕組みが、モデル駆動開発の基盤をAI活用のハーネスとして機能させます。
このハーネスの枠組みを補助線にすることで、実績ある概念と構成方法に沿って、整合性のあるオブジェクト・モデルを構築できます。AIも、その枠組みの中でモデルの記述や実装の補完を進めるため、既存の仕組みで解決できる部分に独自の構造や処理を持ち込むことを抑えられます。
静的検査・実行時検査・AIレビューを組み合わせる
モデル定義の型や参照先、関係の宣言など、実行前に確かめられる条件を静的検査の対象にします。実データの値、存在する対象間の多重度、同時更新時の所有など、実行状態に依存 (Dependency)する条件は実行時の検査や制御へ接続します。規則の性質に応じて、静的検査と実行時の検査を分担させます。
ユースケースと静的モデルの整合を確かめる
自然言語のユースケースを人間が読み、設計や実装の手掛かりにする運用に加えて、CMLによる文法定義とAIの活用により、ユースケースもモデル検査の対象になります。textus-cbd-supportのレビューでは、シナリオが参照する概念、関係、責務と静的モデルの対応を確認できます。実行できるかどうかと、検査の対象にできるかどうかは別の性質です。
注文を確定するユースケースなら、対象の注文を特定できること、明細と商品の関係が定義されていること、金額の意味が共通であることを確認します。シナリオが明細の共有を前提とし、静的モデルが排他的な所有を定めていれば、両者を調整する必要があります。要求との追跡性は、記述した構造が何を実現するためのものかを確認する役割を持ちます。
モデルを実装と変更管理に活用する
静的モデルに記述した同一性や所有関係は、Textusがオブジェクトを保存・復元するときや、更新範囲を定めるときに利用できます。また、用語を通じて関連する文書や知識との対応を保持することで、モデルを変更した際に、見直すべき補完実装、検査、業務上の説明をたどれます。
静的モデルを永続オブジェクトへ接続する
リレーショナルデータベースを利用する場合、オブジェクトとテーブル、属性と列、識別子とキー、オブジェクト間の関係と参照の対応を定めるORマッピングを使用します。SimpleModelingではTextusがORマッピングを自動化し、静的モデルの記述を永続化 (Persistence)へ接続します。汎化や所有の表現も、この対応を考える際の基礎になります。
注文の例では、注文識別子による同一性を保って、注文と明細を保存・復元します。集約モデルの整合性境界と、永続化時の更新単位を対応付けます。履歴保存、削除、並行更新などの業務規則を明示し、採用する保存方式や処理系の対応範囲に合わせて実現します。
モデルの意味を実行方針へ接続する
モデル要素の分類、同一性、所有、関係は、処理系が利用する実行可能なメタデータにもなります。エンティティの同一性を永続化やキャッシュのキーへ、所有の境界を更新やロックの単位へ、資源と処理の契約をスケジューリングや資源割当てへ接続する際の判断材料にできます。モデルの意味と実行方針の対応を定義することが前提です。
分割配置、並行性、観測にもモデルの識別子や境界を利用できます。永続化方式やロック方式は、性能 (Performance)、信頼性 (Reliability)、セキュリティ (Security)などの要求を踏まえて選び、処理系が対応する範囲で実現します。モデルの意味を方針の選択と適用へ結び付けることが、この接続の役割です。
用語を介して知識モデル・文芸モデルと連携する
静的モデルの概念や関係は、用語を媒介に知識モデルと文芸モデルへ連携します。用語集の名称、定義、識別子を共有し、モデル要素と、業務の意味や判断の根拠を説明する文書を対応付けます。例えば「注文」の成立条件を文書で説明し、同じ用語を注文の型、属性、関係へ結び付けます。
知識モデルでは、用語に対応するRDFノードを通じて文書とオブジェクト・モデルの意味関係を保持します。用語やモデルの変更時には、関連する文書、構造、知識の対応をたどり、整合を確認できます。実際のガードは、用語の参照とモデル間の対応を検査するツールを開発工程に接続して実現します。
ビジネス・モデル、要求モデル、ドメイン知識のうち文章で表す内容も、文芸モデルとして静的モデルにつなぎ、開発中に利用し続けます。この連携を基盤に、知識化したオブジェクト・モデルと文芸モデルをMCP (Model Context Protocol, モデル・コンテキスト・プロトコル)で生成AIへ提供することを当面の目標とします。その提供環境と知識ハーネスの詳細は第8回で扱います。
まとめと動的モデルへの接続
静的モデル・ハーネスは、ソフトウェア工学の蓄積から実用化された概念・部品・パターンを、検査・実行できるモデルの枠組みとして活用します。型、同一性、分類、所有、関係、多重度を明示し、実績ある構成方法に沿ってオブジェクト・モデルを構築します。AIによる生成・変更もこの枠組みに通すことで、契約違反を検出し、不要な独自構造や処理の持ち込みを抑えます。
第4回では、ここで定めた対象がどのイベントを受け、どの条件で状態を変えるかを状態機械 (StateMachine)とワークフローで記述します。第5回以降はアーキテクチャ、プログラミング、ランタイムへの具体化へ進みます。用語集を介したモデル間の意味の連携を踏まえ、共通知識とプロジェクト固有の知識を生成AIへ提供する知識ハーネスは第8回で扱います。
参照
用語集
- モデル (Model)
-
Modelとは、対象を特定のPurposeとConcernに基づいて選択し、理解、判断、検証、構築に利用できる形で表した抽象です。対象そのものではなく、目的に必要な要素、関係、意味を保持する表現です。
- 制約 (Constraint)
-
UMLにおけるConstraintは、一つ以上のModel ElementのSemanticsの一部を宣言するため、自然言語または機械可読言語で表した条件または制限です。評価結果はBooleanであり、評価は副作用を持ちません。
- イベント (Event)
-
UMLにおけるEventは、Behaviorの実行中に発生し得る出来事を記述するものです。EventのOccurrenceを受け取ることで、StateMachineのTransitionなどのBehaviorが起動されます。
- 同一性 (Identity)
-
Identityとは、値やStateが変化しても、ある対象を他の対象と区別し、時間を通じて同じ対象として追跡するための同一性です。IdentifierはIdentityを表現または参照する値であり、Identityそのものと同義ではありません。
- 型 (Type)
-
Undefined
- ドメイン・モデル (Domain Model)
-
Undefined
- アプリケーション・モデル (Application Model)
-
アプリケーション・モデル(Application Model)とは、ユースケースをアプリケーションがどのように実現するかを、参加者、役割、責務、協調、相互作用、状態遷移、イベント、サービス、操作、結果によって表す目的別のモデルです。
- 振る舞い (Behavior)
-
UMLにおけるBehaviorは、そのContextとなるBehaviored Classifierが時間とともにどのようにStateを変えるかを定める仕様です。可能な実行、創発する振る舞い、または特定の実行例を表せます。
- 責務 (Responsibility)
-
Responsibilityとは、ObjectまたはRoleが、何を知り、判断し、行い、守るべきかを表す義務です。構造上の情報だけでなく、規則とBehaviorの所有を定めます。
- オブジェクトモデリング (Object Modeling)
-
Undefined
- ビュー (View)
-
Viewとは、Modelを特定のPurposeとConcernに応じて選択し、理解、判断、検証、利用できる形で投影した表現です。ViewはModelの一部を見せるものであり、元のModelとは別に意味を所有しません。
- オブジェクト (Object)
-
Objectとは、Classまたは他のClassifierによって分類され、構造、State、Behaviorを持ち得るInstanceです。Objectは、同じClassifierの他のInstanceと区別して参照できる個体として扱われます。
- オブジェクト・モデル (Object Model)
-
Undefined
- 用語集 (Glossary)
-
Glossaryとは、対象領域で使用する用語について、名称、意味、境界、同義語、識別子を管理する知識資源です。関係者が同じ用語を同じ意味で扱うための共通基盤になります。
- 識別子 (Identifier)
-
Identifierとは、Identityを持つ対象または相関対象を参照し、他の対象から区別するために使用する値です。IdentifierはIdentityを表現できますが、対象が時間を通じて同じ対象であるというIdentityの意味そのものではありません。
- BoK (Body of Knowledge)
-
SimpleModelingでは文脈共有の核となる知識体系をBoK (Body of Knowledge)と呼んでいます。 BoKの構築は、知識の共有、教育、AIによる支援、自動化、意思決定支援を可能にするための基盤です。
- 知識モデル (Knowledge Model)
-
知識モデル(Knowledge Model)とは、SimpleModelingモデルに含まれる概念、意味関係、分類、規則、根拠、出典などを、主として生成AIが参照、探索、関連付け、解釈できる形で構造化したモデルです。
- クラス図 (Class Diagram)
-
Class Diagramとは、Class、Interface、Data Type、Association、Generalization、Dependencyなどを用いて、Modelの静的構造を示すUML Diagramです。
- 文芸モデル (Literate Model)
-
Undefined
- Cozy Modeling Language (CML)
-
CML(Cozy Modeling Language)は、オブジェクト・モデルのうち、プログラム生成と実行へ接続する実行可能モデルを記述するSimpleModelingの形式モデリング言語です。
- 実行可能モデル (Executable Model)
-
Undefined
- Textus
-
Textusは、SimpleModelingによって実現されたソフトウェアを動作させるための実行基盤です。アプリケーションに共通する実行、運用、連携の機構を提供します。
- シンプルモデリング (SimpleModeling)
-
SimpleModelingは、KnowledgeからDomain Modelを構成し、CMLで形式化し、CozyとAIによって実行可能ソフトウェアへ実現し、Textus上で動作させる、モデリング中心のソフトウェア開発方法論と技術体系です。
- 多重度 (Multiplicity)
-
UMLにおけるMultiplicityは、下限から上限までの非負整数の包含区間によって、Model ElementのInstanceに許される個数を定める情報です。上限は無制限の場合があります。
- 状態 (State)
-
UMLにおけるStateは、ある不変条件が成立している状況をモデル化したものです。Objectの現在のStateによって、受け付けられるEventやOperation、成立するConstraint、次に可能なTransitionが変わります。
- ライフサイクル (Lifecycle)
-
Lifecycleとは、ある対象が生成されてから終了するまでに、Identityを保ちながら通過するStateとTransitionの範囲です。
- 妥当性確認 (validation)
-
Validation(妥当性確認)とは、システムや機能が利用目的や要求仕様に対して妥当であるかを確認する行為である。
- パワータイプ (Powertype)
-
Undefined
- 汎化 (Generalization)
-
UMLにおけるGeneralizationは、より一般的なClassifierと、より具体的なClassifierの間の分類学的Relationshipです。具体側のInstanceは一般側のInstanceでもあり、具体側は一般側のFeatureを継承します。
- 集約関係 (Aggregation)
-
Undefined
- トレイト (Trait)
-
Undefined
- 合成関係 (Composition)
-
Undefined
- 特徴 (Feature)
-
UMLにおけるFeatureは、ClassifierのInstanceを特徴付ける構造上または振る舞い上の性質です。AttributeなどのStructural Featureと、OperationなどのBehavioral Featureがあります。
- クラス (Class)
-
Undefined
- 操作 (Operation)
-
UMLにおけるOperationは、関連するBehaviorを呼び出すための名前、型、Parameter、Constraintを定めるClassifierのBehavioral Featureです。Operationは呼び出し契約を定め、MethodなどのBehaviorがその実現を担います。
- 不変条件 (Invariant)
-
Invariantとは、対象が有効である間、観測可能な安定点で常に成立しなければならないConstraintです。Object、Type、または複数要素からなる構造に適用できます。
- 属性 (Attribute)
-
Attributeとは、ClassifierのInstanceが保持し得る値または参照を表すStructural Featureです。Attributeは名前、Type、Multiplicity、既定値、Constraintなどによって特徴付けられます。
- ドメイン・オブジェクト (Domain Object)
-
ドメイン・オブジェクトとは、ソフトウェアシステムが対象とする現実世界の領域(ドメイン)を表現するためのオブジェクトであり、ビジネスロジックや概念的構造を内包します。 これは、エンティティ、バリュー・オブジェクト、サービス、ルール、イベントなどの要素を含む、ドメイン・モデルを構成する中核的な構造です。 ドメイン・オブジェクトは、システム内でのデータ構造や処理の単なる表現ではなく、問題領域の意味や振る舞いを反映するモデルの一部です。
- エンティティ・オブジェクト (entity object)
-
エンティティ・オブジェクトは、ドメイン・モデルにおいて一意の識別子(ID)を持ち、ライフサイクルを通じて継続的に識別・追跡されるオブジェクトです。 エンティティは変更可能であり、同じIDを持つ限り状態が変わっても同一のオブジェクトとして扱われます。
- バリュー・オブジェクト (value object)
-
バリュー・オブジェクトは、ドメイン・モデルにおいて属性や説明などの意味的まとまりを持った値の集合を表すオブジェクトです。 エンティティのような永続的識別子は持たず、不変であり、等価性は値によって判断されます。
- ユースケース (Use Case)
-
UMLにおけるUse Caseは、対象システムがActorまたは他の利害関係者に観測可能な価値あるResultをもたらすために実行するActionの集合を定めるModel Elementです。
- 依存 (Dependency)
-
UMLにおけるDependencyは、ClientとなるModel Elementの仕様または実装が、Supplierとなる別のModel Elementの定義へ意味的または構造的に依存することを表すDirected Relationshipです。
- 永続化 (Persistence)
-
Undefined
- セキュリティ (Security)
-
Securityとは、情報と機能を正当な権限に従って保護し、不正な閲覧、利用、変更、破壊、否認を防ぐ性質です。Confidentiality、Integrity、Authenticity、AccountabilityなどのConcernを含みます。
- 信頼性 (Reliability)
-
Reliabilityとは、指定された条件と期間のもとで、システムが要求された機能を一貫して遂行する性質です。Availability、Fault Tolerance、Recoverabilityなどを含む観点から評価します。
- 性能 (Performance)
-
Performanceとは、指定された条件と資源のもとで、システムが処理時間、応答時間、Throughput、容量などの時間的要求を満たす性質です。
- 観測記録 (observation, オブザベーション)
-
対象の現象を捉えて記録した結果。
- RDF
-
W3C により標準化された、情報を「主語–述語–目的語」の三つ組(トリプル)で表現するための知識記述モデル。
- モデル・コンテキスト・プロトコル (MCP, Model Context Protocol)
-
モデル・コンテキスト・プロトコル(Model Context Protocol、MCP)とは、生成AIを利用するアプリケーションと外部のデータ源やツールを接続し、コンテキストと機能を標準化された形で提供するためのオープンプロトコルです。
- 仕様確認 (verification)
-
Verification(仕様確認)とは、規定された設計仕様や要求仕様に対して、実装が一致しているかを確認する行為である。
- 状態機械 (StateMachine)
-
UMLにおけるStateMachineは、Eventの発生によって起動されるTransitionでStateのグラフをたどり、システム要素のevent-driven Behaviorを表すBehaviorです。