2016-09-18 8 views
4

私は今ArgoUMLでUMLアクティビティ図を設計しています。 私は条件を設計する場合のようなことを知っている:それは次のようにUMLのアクティビティ図で行うことができるUMLの意思決定後の意思決定(ダイヤモンド)

if(condition) { 
    doTrueAction(); 
} else { 
    doFalseAction(); 
} 



enter image description here

しかし、何を、我々は以前の出力内側に別の条件を持っている場合決定?このように:

if(condition) { 
    if(condition2) { 
     condition2TrueAction(); 
    } else { 
     condition2FalseAction(); 
    } 
}else{ 
    conditionFalseAction(); 
} 

enter image description here

あなたはconditionTrueOutputがここに同時に出力し、条件されている見ての通り。デザインが壊れているようです。

編集:または、私は意思決定(ダイヤモンド)要素の代わりにフォーク要素を使用する必要がありますか?

enter image description here

私はこれを正しく設計する方法を知りたいです。ルールはありますか?

+1

フォークは、アクティビティを並行してマークするために使用されますが、そうではありません。とにかく、1つ以上の結合がフォークに従わなければなりません。 – acornagl

+0

@acornaglはい、そうです。 – Vanguard

答えて

2

あなたの考えに間違った前提があります。 Decisionには出力がありません。条件付きの制御フローだけが残っています。それぞれはある条件で守ることができます。このガードは、角括弧で書かれている:(編集する際に、むしろいい加減で、実際にそれを省略することができます)私は最初のテストの後(暗黙の)[true]ガードを書いていない

enter image description here

注意。

編集私の最初のダイアグラムでは、アクションに外出する制御フローがないという別の欠陥がありますが間違っていました。実際に超構造は、Actionを処理した後に、欠落している発信制御フローがFlowFinalに相当すると述べています。だからあなたのダイアグラムはここで正しいです。

あなたの編集に関して:コメントが言うように、これは並行して続けられます。ネストされた条件は、上記のようにする必要があります。

EDIT2 Isterコメントで述べたように、Decisionは外出だけifelse制御フローよりも多くを有するが、1より大きい任意の数PにUML 2.5ステートができます。 388:

ブロックされていない発信エッジの正確に一つの目標は、トークンを受け入れる場合は、その後、トークンは、対応するエッジを横断し、他のすべてのオファーは引き抜かれます。複数のターゲットがトークンを同時に受け入れる場合、トークンは受け入れ対象に対応するエッジの1つのみをトラバースしますが、この仕様では決定されません。

非決定論的な振る舞いを避けるために、モデラーは、各トークンに対して最大で1つのガードが真であると評価する必要があります。 1人のガードだけが真と評価されることが保証されていれば、適合した実装は、真と評価されたすべての出側エッジのガードを評価する必要はありません。

DecisionNodesでのみ使用する場合、あらかじめ定義されたガード "else"(演算子として "else"を持つ式として表現され、オペランドなし)は、最大1つの出力エッジで使用できます。このガードは、トークンがDecisionNodeからの他の発信エッジによって受け入れられない場合にのみ真と評価されます。

+0

@pyramidPeak:トーマスは正しいですが、一つのことは彼のダイアグラムでは間違っています。条件は、ダイヤモンドの近くにラベルとして配置するのではなく、コントロールフローに沿って角括弧で囲んでください。 1つのフローに[条件]があり、もう1つに[条件=偽]があります。あるいは、条件をダイヤモンド内部に配置し、制御フローの近くにあるガード表現を[= true]と[= false](等号に注意)にします。例はUML 2.5仕様、図14.25を参照してください。 –

+0

@Thomas:「ActivityFinalNode」を使用する必要はありません。 UML 2.5の仕様から、「ストリーミングパラメータのないアクティビティの実行は、ノードが実行されておらず、実行可能なノード 、*または*がActivityFinalNodeを使用して明示的に終了されたときに完了しません。 –

+0

@ JimL。ありがとう。おそらく私はそれを明示的にするために 'Final'を使うことに慣れていたでしょう。答えを更新します。 –

0

あなたのデザインは一貫しているようですが、UML図ではありません。私はあなたがアクティビティ図シーケンス図を混ぜていると思います。

ダイアグラムはシーケンス図のように見えますが、アクティビティ図に関連する情報を表示しようとします。

私はあなたにこの2つの図の違いを調べるためにこのweb siteを提案します。私はそれがあなたを助けることを願っています。

代わりに、デザインを使用しようとすると、2つのcondotion2の前に別のの条件(たとえばSecondConditionAction)を挿入することをお勧めします。

関連する問題