2011-11-15 42 views
0

私は状態図の状態を与えられた列挙型の値にします。 2番目のステップでは、状態図を前述のenum型のプロパティの制約として使用したいと思います。プロパティーのセッターの引数チェックとして。enum値を状態図の状態として使用するにはどうすればよいですか?

+0

私は、モデル内にRedefined Classifier属性があることがわかりました。それは答えかもしれないようですが、私はまだ分かりません。 –

+0

質問を明確にすることはできますか?つまり、「enumの値の間の正当な遷移のみが許されるように状態図を実装するにはどうすればいいのですか?」 – sfinnie

+0

元の質問を編集してそれを鎮静化しました。 –

答えて

0

まだわかりません達成しようとしていることを完全に理解しています。しかし、ここではいくつかの考えがあります。ポイントを逃した場合にはお詫び申し上げます。

最初の質問は、なぜ列挙型の値と状態を同形にしたいのですか?情報を複製する最も一般的な意味で。複製された情報には、同期が外れる習慣があります。したがって、動機づけを理解することは有益です。

にもかかわらず、ここにいくつかの可能性があります。 UMLの世界で

1. UML /モデリング・パースペクティブ

状態モデルとそれに関連する列挙型の両方を持っている本当の必要はありません。一般に、UMLは、オブジェクトの現在の状態の値を読み取る方法を定義していません。ただし、特定のプロファイル(例:Executable UML)があります。実行可能なUMLでは、ステートマシンを持つクラスはすべて、current_stateという名前の読み取り専用属性を自動的に取得します。 current_stateの可能な値は、状態モデル内の状態の名前です。したがって、暗黙の列挙型を定義する状態マシンと見なすことができます。

この属性は読み取り専用です。それを変更する唯一の方法は、ステートマシンを使用する方法、つまりオブジェクトにイベントを送信する方法です。したがって、これはまた、ステートマシンプロトコルに違反する方法でcurrent_state変数の値を変更することはできません。

実行可能なUMLプロファイル(または同様のもの)を使用していなくても、上記をルール/規則として記述するのは完全に有効です。必要に応じて自分のプロファイルを定義することができますが、それは過度の可能性がありますが、状況によって異なります。

重要な点は、モデリングの世界では列挙型は必要ないということです。

2.コード視点

コードにモデルを変換するとき、列挙は、現在の状態変数のタイプを定義するために賢明かつ一般的な方法です。モデル化のシナリオでは、current_state属性を外部にのみ読み取るようにしたいと考えています。

  1. ステート・マシンの実装内からcurrent_state変数を更新するためのプライベートメンバ関数
  2. ステートマシンをドライブするイベントごとに、
  3. パブリックメンバ関数:あなたは次の3つの他のものを必要とします状態マシンの実装。

したがって、コードの世界では、変数をcurrent_state変数の無効なシーケンスが外部にのみ読み取られるようにすることを防止します。つまり、public読み取りアクセッサーしかありません。public writeアクセッサーはありません。

クラス内では、書き込みアクセサーをプライベートにして、呼び出されるのはステートマシンの実装内にあることを保証します。

パブリックの書き込みアクセサーの代わりに、ステートマシンを駆動するイベントに対応するパブリックメソッドを提供します。もっと下のステートマシンを実装上の詳細が、ここでは今のところ簡単な例です: 1.国家マトリックスまたはルック:

class Phone { 

    enum PhoneState {disconnected, connecting, connected, disconnecting}; 

    public PhoneState current_state {get}; //no write accessor 

    //functions for generating state machine events 
    public void digit(int number) {..}  //press digit key, e.g. while dialing 
    public void connect() {..} //make connection 
    public void disconnect() {..} //disconnect 
} 

ステートマシンを実装

ステートマシンを実装するための3つの一般的なパターンがあります表 2.ネストされたスイッチ 3.状態パターン

(1)hereの概要があります。 (2)&(3)は、hereに含まれています。

それは基本的にそれです。あなたの質問に私が答えたかどうか完全には分からない。謝罪しない場合は、達成しようとしていることについてより具体的なものかもしれません。

hth。

+0

それは私の '問題'を解決しませんが、それは本当に良い概要です、私はさらなる研究のためのいくつかの指示を持っています。 –

+0

ご迷惑をおかけしましたことをお詫び申し上げます。多分あなたは精巧にすることができますか? – sfinnie

0

列挙プロパティは、次のようにUMLで表現されています

_______________________ 
| <<enumeration>> | 
| DaysOfTheWeek | 
|_____________________| 
| Sunday    | 
| Monday    | 
| Tuesday    | 
| ...     | 
|_____________________| 

次に、あなただけ列挙し、あなたの状態図との関連を描くことができます。

希望これは私が詳細に実装を知らないが、私は、ステートマシンのパターン、ステートマシンを実装するための非常にエレガントな方法にあなたをリダイレクトします

0

いくつかのツールでは、列挙型>状態図の作成をクリックすることができます。これは、状態図がUMLモデルツリーの列挙型のルートに作成されることを意味します。したがって、状態図にはenumプロパティがあります。

+0

私が使用しようとしているツール(EclipseベースのTOPCASED)にはこのようなオプションがないか、または私はそれを見ることができません。それでも、あなたの答えは、私をさまざまな角度から見るのに役立ちます。 –

関連する問題