web-dev-qa-db-ja.com

領域を使用したUMLアクティビティ図のループ

UMLアクティビティ図でループをモデリングしています。単純な条件ノード(図1)でうまく機能しますが、ループのセマンティクスを強調するより表現力のある方法を探しています。そこで私は herethere で示される「領域」または「割り込み可能領域」に来ましたが、本当に満足できる例は多く見つかりませんでした。

私の例は、指定されたリストのメッセージを処理する関数です。最初の有効なメッセージが見つかるとすぐにループが中止され、メッセージが処理されて、関数はtrueを返します。それ以外の場合、falseを返します(センスやナンセンスについてはコメントしないでください。サンプルのためだけです)。

図1:古き良きアクティビティ図の条件付きノードを使用します。確かに、矢印に沿って制御フローを追跡する方が簡単ですが、「ループ」はなく、「if」のみがあります。

図2:

  • 割り込みエッジを使用して、(正の)終了条件は正しいですか?確かに、それはループの[test]セクションの一部であり、イテレーターと一緒になります。
  • ところで:forループの反復特性はUMLでどのように最もよく表現されますか?
  • ループ本体内のアクティビティの最終ノードは正しいですか(つまり、条件付きの「メッセージが有効ですか?」が「no」を生成する場合)?ここで最終ノードを使用するのはどうやら間違っているように感じますが、他に制御フローを表現するにはどうすればよいですか1つのループの

両方の図の機能は同等である必要があります。

loop with conditional node

loop with region


編集:Stephからの提案を実装する別の図:

  • ループ本体内の最初と最後のノード
  • 「さらなる処理」は、ループ本体内にあります。さて...ここでOKですが、私はそれを外に持ちたいと思う他のループがあるかもしれません。とにかくデザインを変更するかもしれません...
  • 「次のメッセージ」は、元の図のaction "(provide the)next message"の代わりにiterator object自体として見ることもできます。
  • 2つのオブジェクトフローの矢印は少し使い過ぎかもしれませんが、正しいと思います。

enter image description here

20
minastaros

UMLでは、アクティビティの最終ノードは完了を表します。したがって、ループ領域内で使用するのは正しいです。ループのコンテンツの通常の完了です(次の反復につながります)。サイドノートとして、ループの開始にも初期ノードを使用することをお勧めします。

また、完了ではなく、出口を表すフロー最終ノードもあります。したがって、使用する割り込みEdgeの代わりに、これを使用して「break」ステートメントを表すことができます。この場合、このフローの最終ノードの直前に、「yes」ブランチで「さらなるメッセージ処理ノード」を統合する必要があります。

割り込みEdgeは、現在の処理の外部からの割り込み用です。領域は割り込み可能であり、一部のイベント(通常は受信ノードで示されます)は、領域のコンテンツの進行に関係なく、完全に中断する場合があります。ここではそうではありません。

繰り返しの文字に関しては、残念ながら非常に視覚的なものはありません。私は、最初のノードの横にある領域の上部にあるオブジェクトノードを使用する傾向があります。

10
Steph