ComponentContract#
Componentが要求する能力と提供する境界は、ComponentContractという一つの宣言値にまとめます。Componentとの関係は継承ではなく、Componentが返す契約の包含です。
ComponentContractの役割#
ComponentContractは、Componentが要求する能力と提供する境界を一つの宣言値として所有します。Componentの継承階層を表すものではなく、GraphとCompilerが接続・実行条件を検証するための境界です。
構造要素#
フィールド |
宣言する内容 |
|---|---|
|
roleごとの |
|
Component全体が必要とする |
|
保持するコンポーネントの |
|
|
|
|
|
|
|
コンパイラが扱う前提条件 |
portsのroleは、同じComponentをGraph上の役割ごとに接続するための名前付き集合です。partsは子Componentの実装を複製する値ではなく、子の契約を親の契約へ含める宣言です。
各契約が保持する情報#
契約 |
保持する情報 |
主な検証 |
|---|---|---|
|
入力と出力の |
ポート名、方向、DataSpec、cardinality |
|
読み取り、書き込み、公開する |
宣言外の状態アクセス、状態効果 |
|
消費するイベントとFeedbackContract |
イベントとFeedbackの互換性 |
|
必要または提供するRuntimeの機能 |
実行環境の能力不足 |
|
コンポーネントが置く前提条件 |
前提条件の登録と既定値 |
生成時点と利用時点#
Componentはcontract()で契約を生成し、ComponentNodeはコンパイル単位のスナップショットを保持します。Compilerは契約をポート互換性、サービス解決、状態効果、ライフサイクル、Runtimeの機能の検証に使います。Runtimeは検証済みのExecutablePlanに含まれる契約境界に従ってStateViewを作り、結果のStatePatchを適用します。
不変条件と診断#
契約は凍結されたデータクラスとして扱われ、Compilerの検証中に変更されません。ports、required_services、partsは対応する宣言値だけを含み、role名とコンポーネント名は識別子として検証されます。状態のreads、writes、exportsは型付きStateKeyを使い、Runtimeは宣言されていないキーをComponentに公開しません。必要な実行能力がCompileContextの提供する能力にない場合、CompilerはExecutablePlanを実行可能としてマークできません。呼び出せない契約や誤った戻り値の型はcontract_unavailableとなり、保持されたコンポーネントの契約が宣言と異なる場合はpart_contract_mismatchとなります。対象ポート、必須サービス、状態効果、ライフサイクル、Runtime能力の不整合もCompilerの診断として報告されます。無効な契約型を作成するとValidationErrorが発生します。
最小例#
from saealib.core import ComponentContract, StateContract
def contract() -> ComponentContract:
return ComponentContract(state=StateContract())
拡張点#
コンパイラ規則の公開経路はリリースごとに異なる可能性があるため、具体的なインポートはAPIリファレンスで確認してください。