ステートマシンは互いに関連している変数、関数、ステートトランジションそしてテンプレートを1つに纏めます。
UJMLアプリケーションは変数、ステートトランジションと関数を互いに連携させることにより期待した動作をします。 しかしこれらの異なる部品が、同じアプリケーションの中に記述されているということを除いて互いの関連性が希薄になってしまうことがあります。 関連項目: UJMLアプリケーションの構造。 この現象は規模の大きなプログラムにおいて複雑で可読性の低いコード(スパゲッティコード)をもたらしてしまいます。
この問題を解決するために、UJMLはステートマシンを提供しています。ステートマシンは互いに関連している変数、関数、ステートトランジションそしてテンプレートを1つに纏めたものです。ステートマシンはコードのモジュール化と簡素化を促すとだけでなく、適切に使用された場合、 異なるアプリーション間での修正が不必要な、再利用可能な関数のライブラリとコンポーネントを実現します。
ステートマシンはstate-machines要素で宣言します。この要素には一つまたは複数のstate-machine要素を記述します。 関連項目: state-machines、 state-machine。 各state-machine要素は独立した、名前つきのステートマシンを宣言し、子のステートマシン、変数、関数、テンプレート、そしてステートトランジションを含みます。
ステートマシンに記述されている識別子、例えば変数、関数やテンプレートはメンバーと呼ばれます。 関連項目: 識別子。 ステートマシンのメンバーはpublicまたはprivateに設定することが可能です。 関連項目: スコープ、 共有。 ステートマシンの親要素が含むコードはステートマシンのpublicなメンバーのみをアクセスすることが可能です。 アクセスには、ドットノーテーションという次の記述方法を使用します: 'StateMachineName.MemberName'。例:'foo.bar'。
ステートマシンの親要素のスコープ中のコードからは、publicなステートマシン変数の値を取得・変更する、 publicなステートマシン関数を呼ぶ、そしてpublicなステートマシンテンプレートをexpandする、 といったことを行えます。 ステートマシンはリンクされたパーティションと共有することも可能です。 関連項目: ステートマシンのスコープと共有。
ステートマシンではビジュアル要素のテンプレート宣言を記述し、そのビジュアル要素を ステートトランジションから表示することが可能です。 関連項目: ビジュアル要素、 ステートトランジション。 これは、ビジュアル要素を含むステートマシンに2つの設計方法があることを意味しています。 1つ目の方法はステートマシンからpublicなステート変数を提供する、あるいはpublicな関数を通じて ステート変数を変更する方法。2つ目の方法は外部からexpandすることが可能な publicなビジュアル要素テンプレートを提供する方法です。 関連項目: ビジュアル要素テンプレート。
後者の方法では、テンプレート中のスクリプティング要素からアクセスすることができる変数と関数は、 テンプレートが宣言されたステートマシンと同一スコープのものに限られます。 例えばアプリケーションが'foo'という名称の変数と、同じく'foo'という名称の変数をもつステートマシンの両方を含む場合、ステートマシンにおいて宣言されたテンプレートはアプリケーションのスコープ内で展開されたとしてもステートマシンのスコープ内の'foo'を使用することを意味します。 関連項目: ステートマシンのスコープと共有。
ステートマシンに記述されているビジュアル要素のz-orderは、ステートマシン中の記述順序によって決定します。 関連項目: ビジュアル要素、 Z-Order。 ステートマシン自身のz-orderは、ステートマシンの親要素の記述位置に依存します。
ステートマシンのz-orderは親要素の記述位置に依存します。 ステートマシンは、親要素の中の一番最初、あるいは一番最後の位置に記述することができます。 前者の場合、ステートマシンのz-orderは親要素に含まれる他の要素の前景に描画されるz-orderが、 後者の場合は親要素に含まれる他の要素の背景に描画されるz-orderが与えられます。
テンプレートによるz-orderの制御は、ステートマシンが提供する唯一無二のz-order制御方法です。 ステートマシンのpublicなテンプレートは、そのステートマシンをスコープ中に含むUJMLコードの どの場所においてもexpandすることが可能です。その場合、テンプレートに 含まれるビジュアル要素はexpand要素と 同じz-orderを持ちます。 関連項目: ビジュアル要素テンプレート。
applicationやpartitionに1つまたは複数のステートマシンを記述できように、ステートマシンにも他のステートマシンを記述することができます。 入れ子になったステートマシンのz-orderとスコープは、applicationとpartitionと同様の法則に従います。 関連項目: ステートマシンのスコープと共有。
備考: 入れ子になったステートマシンのz-orderは親ステートマシンのz-orderを基点に決定されます。
ステートマシンを入れ子構造で記述し、小さな、簡単なステートマシンを合体・拡張することにより、 強力な複合ステートマシンを構築することが可能です。
include要素は、外部のパーティションファイルから現在のファイルにステートマシンのコードをコピーします。 関連項目: パーティションファイル、 ファイルのインクルード、 include。 これはUJMLステートマシンのコードを1つのファイルからその他のファイルにコピー&ペーストした場合と同等の結果をもたらします。 ステートマシンのインクルードが複数回行われた場合、インクルードを行ったファイルには複数のステートマシンが存在することになります。
備考: 特定のスコープ内におけるインクルードを行える回数は1回に限られます。しかし、同一ファイル内の異なるスコープ内で再度インクルード することが可能です。 関連項目: スコープ
インクルードされたステートマシンが他のステートマシンをインクルードしているとステートマシンファイルの依存関係が発生します。 自分自身をインクルードするステートマシンや、自分自身をインクルードする他のステートマシンのインクルードを行うと 循環依存が発生し、コンパイラーはエラーを吐きます。。
ステートマシンは、子要素として関数のみを記述したものを作成することができます。 このようなステートマシンは互いに関連している関数を一箇所にまとめたい場合に便利です。 またステートマシンが外部のファイルによってインクルードされる場合、 異なるUJMLアプリケーション間で関数を再利用することを可能にします。
ステートマシンを使うと特定のタスクを行う/データを格納する/ビジュアル要素を表示する、といった 一連のコードを1つのパッケージに纏めることが可能になります。 このようなステートマシンをUJMLアプリケーションからインクルードすると、 標準的なコードを再利用するだけでリッチなアプリケーションを迅速に作成することが可能になります。 関連項目: Component サンプルコード。
ステートマシンを作成しても、それが再利用可能であるとは限りません。 再利用性は結合を最小限に留め、一貫性を高めると最大化されます。 再利用可能なステートマシンを作成するには、は外部コードに対する依存性(結合)を最小限に留め、 限られた機能をよく実行する(一貫性)必用があります。
UJMLのステートマシンの場合、依存を無くすか、依存を自身の親のステートマシンに限ることにより、 最初の目的(疎結合)を達成することができます。 ステートマシンを親要素の変数や関数に依存させてはなりません。 またステートマシンのpublicなメンバーを減らすことにより、親要素からステートマシンへの結合を減らす必用があります。 ステートマシンからステートマシンの呼び出し側に情報を通知する場合は、 ステートマシン内部では使用していないpublicなステート変数に特定の値を代入する方法を使用します。 ステートマシンの呼び出し側は、そのステート変数の値に応じてステートトランジションを適切に処理します。
一貫性は、ステートマシンの設計の密度に関連しています。 十徳ナイフのようにありとあらゆる処理を行うコンポーネントではなく、 特定の限られた機能を提供する、小さなステートマシンを数多く作成すると一貫性を達成することが可能になります。 ステートマシンのpublicなメンバーは、できる限りわかりやすくしてください。 publicな関数は動詞、publicな変数は名詞である、と考えてください。
|
項目 |
説明 |
|
ステートマシンは、共有可能なスコープ付きの識別子。 |
次の例は、色つきの長方形をデバイスの画面全体に表示する簡単なステートマシンコンポーネントの一例です。 このステートマシンは、2つのpublicメンバーを提供しています:'sShow'という名称の ステート変数は、値がtrueの場合、色付きの長方形を表示します。init()という名称の関数は、 長方形の色の設定を行う機能と、アプリケーション起動時に長方形を描画するか否かを設定する機能を持ちます。 このサンプルコードはbackground.ujms サンプルコードの一部です。
<ujml>
<partition>
<state-machines>
<state-machine name="Background">
<state-variables>
<state-var name="sShow" type="boolean" visibility="public"/>
</state-variables>
<variables>
<var name="mColor" type="int" visibility="public"/>
</variables>
<functions>
<!--
Sets the color property and turns on the background if requested.
-->
<function name="init" type="void" visibility="public">
<parameters>
<var name="color" type="int"/>
<var name="showNow" type="boolean"/>background.ujms
</parameters>
<script>
mColor = color;
sShow = showNow;
</script>
</function>
</functions>
<states>
<state var="sShow">
<transition value="true">
<display>
<box>
<!-- Fill the screen with the specified color. -->
<width>
<eval>_getIntProperty(&_PROPERTY_INT_SCREEN_WIDTH;)</eval>
</width>
<height>
<eval>_getIntProperty(&_PROPERTY_INT_SCREEN_HEIGHT;)</eval>
</height>
<fg><eval>mColor</eval></fg>
<bg><eval>mColor</eval></bg>
</box>
</display>
</transition>
</state>
</states>
</state-machine>
</state-machines>
</partition>
</ujml>
次の例では、異なるパーティションファイルから2つのステートマシンをインクルードしています。 このサンプルコードはvisualelements.ujml サンプルコードの一部です。
<state-machines>
<include file="/../components/background.ujms" state-machine="Background" />
<include file="/../components/scrollmenu.ujms" state-machine="ScrollingMenu" />
</state-machines>
次の例では、'Background'ステートマシンのinit()関数を呼び出しています。 このサンプルコードはvisualelements.ujml サンプルコードの一部です。
Background.init(&_COLOR_BLACK;, true);
|
Copyright (c) 2000-2005 by UIEvolution, Inc. All rights reserved.
|
|
この項目に関するフィードバックをお寄せください。 Send feedback!
|