UMLアクティビティ図でループをモデリングしています。単純な条件ノード(図1)でうまく機能しますが、ループのセマンティクスを強調するより表現力のある方法を探しています。そこで私は here と there で示される「領域」または「割り込み可能領域」に来ましたが、本当に満足できる例は多く見つかりませんでした。
私の例は、指定されたリストのメッセージを処理する関数です。最初の有効なメッセージが見つかるとすぐにループが中止され、メッセージが処理されて、関数はtrueを返します。それ以外の場合、falseを返します(センスやナンセンスについてはコメントしないでください。サンプルのためだけです)。
図1:古き良きアクティビティ図の条件付きノードを使用します。確かに、矢印に沿って制御フローを追跡する方が簡単ですが、「ループ」はなく、「if」のみがあります。
図2:
両方の図の機能は同等である必要があります。
編集:Stephからの提案を実装する別の図:
UMLでは、アクティビティの最終ノードは完了を表します。したがって、ループ領域内で使用するのは正しいです。ループのコンテンツの通常の完了です(次の反復につながります)。サイドノートとして、ループの開始にも初期ノードを使用することをお勧めします。
また、完了ではなく、出口を表すフロー最終ノードもあります。したがって、使用する割り込みEdgeの代わりに、これを使用して「break」ステートメントを表すことができます。この場合、このフローの最終ノードの直前に、「yes」ブランチで「さらなるメッセージ処理ノード」を統合する必要があります。
割り込みEdgeは、現在の処理の外部からの割り込み用です。領域は割り込み可能であり、一部のイベント(通常は受信ノードで示されます)は、領域のコンテンツの進行に関係なく、完全に中断する場合があります。ここではそうではありません。
繰り返しの文字に関しては、残念ながら非常に視覚的なものはありません。私は、最初のノードの横にある領域の上部にあるオブジェクトノードを使用する傾向があります。