モデル内の各コンポーネントには標準の Mixin 構造が使用されています。各コンポーネントは 3 つの主要 Mixin (UI Mixin、ルール Mixin、グラフィックス Mixin)に分けられます。これにより、ビジネス ロジック(ルール Mixin)をユーザ インタフェース(UI Mixin)およびグラフィックス(グラフィックス Mixin)から分離することができます。通常、UI はルール Mixin で指定された一部の既定値をオーバーライドするため、ここでは Mixin の順序が重要になります。テーブル、テーブル トップ、および脚のデザインは次のように定義されます。
Design Table : TableDesigns TableUI TableRules TableGraphics Design TableTop : TableTopDesigns TableTopUI TableTopRules TableTopGraphics Design Leg : LegDesigns LegUI LegRules LegGraphics
TableDesigns、TableTopDesigns、LegDesigns は単なる組織 Mixin です。この中には実際のルールはありません。デザインを上記の構造に分離することが Intent プログラミングにおける最善の手法です。この構造を使用すると、Intent で利用できる複数の強力な継承機能の使用が促進されるだけでなく、構造化された方法によってユーザがより簡単にデザイン構造にオブジェクトの構成を実装することができます。
通常、ルールの既定値はルール自体の値でしかありませんが、変更した値はルールの動的な値に格納されます。ただし、UI ツールの UI プロパティは、Intent モデルの別の UIProperty パーツによってコントロールされます。このパーツは、既定値と Intent モデルで使用される実際の値の仲介役として機能します。これは、プロパティ(値、選択項目など)のすべての UI ロジックをUIProperty デザインでカプセル化できるようにするために行われます。実際の動的な値は、ビジネス ルールではなく UI プロパティ パーツに格納され、ビジネス ルールは単に UI プロパティの Value ルールを参照します。開発者は、単に値を UIProperty パーツの DefaultValue パラメータに渡すことができます。
また、ルールの既定値を定義するための簡易的な方法もあります。この方法では、既定値のルールの先頭に "dv" を付け、関連する UI プロパティ パーツには "ui" を付ける必要があります。たとえば、テーブルのデザインには Length ルールがあり、既定値は dvLength ルールに格納されます。uiLength という名前の子の UI プロパティをテーブルに追加すると、uiLength プロパティでは、DefaultValue ルールの値に dvLength ルールの値を使用するようになります。この方法を使用する際の注意点として、UI プロパティは UIProperty デザインの拡張機能である BasicUIProperty から派生している必要があります。
通常、ルール Mixin には既定値の定義が格納されており、これらの既定値を使用するビジネス ロジック ルールは単にルール Mixin のパス スルーになります。前の例の場合、Length は単にルール Mixin の dvLength の値を返します。
Parameter Rule dvLength As Number = 60.0 Rule Length As Number = dvLength
ただし、UI Mixin では、ビジネス ロジック ルールは UI プロパティの Value ルールを参照します。このルールは UI ツールによってユーザが指定する値であるためです。
Rule Length As Number = uiLength.Value
既定値とパス スルー ルールをルール Mixin に入れ、UI Mixin の UI プロパティにつなぐと、各種 UI Mixin を空のデザインでオーバーライドするだけで、UI ツールを使用せずに必要に応じて UI を無効化したり、モデルを実行することができるようになります。これは、実際の UI が必要ない場合のバッチ処理や、UI ロジックを完全に切断する必要がある場合のデバッグで役立ちます。
テーブル トップのデザインは、長さ、幅、厚さを持つ単純な長方形のブロックです。これらはすべてデザイン上のパラメータで、上記の標準構造を使用します。
Parameter Rule dvLength As Number = 60.0 Rule Length As Number = dvLength Parameter Rule dvWidth As Number = 24.0 Rule Width As Number = dvWidth Parameter Rule dvThickness As Number = 1.0 Rule Thickness As Number = dvThickness
TableTopGraphics デザインはブロックで混合され、テーブル トップの厚さになるようにブロックの高さのルールをオーバーライドします。
Rule Height As Number = Thickness
脚のデザインも単純な長方形のブロックです。脚の場合は、幅と高さのみを持ちます。
Parameter Rule dvWidth As Number = 1.0 Rule Width As Number = dvWidth Parameter Rule dvHeight As Number = 24.0 Rule Height As Number = dvHeight
LegGraphics デザインもブロックで混合されますが、脚の幅になるようにブロックの脚のルールをオーバーライドします。これは脚を正方形にするためです。
Rule Length As Number = Width
テーブル アセンブリには、テーブル トップと 4 つの脚が含まれています。テーブルの全高、長さ、幅など、モデル全体の最上位パラメータも格納されています。
Parameter Rule dvHeight As Number = 24 Rule Height As Number = dvHeight Parameter Rule dvLength As Number = 60 Rule Length As Number = dvLength Parameter Rule dvWidth As Number = 24 Rule Width As Number = dvWidth
テーブル トップでは、テーブル アセンブリから渡された長さと幅の既定値を取得します。同様に、各脚では高さの既定値をテーブル アセンブリから取得します。
Child TableTop As :TableTop dvLength = length dvWidth = Width End Child Child Leg As :Leg, Quantity = 4 dvHeight = LegHeight End Child