web-dev-qa-db-ja.com

マルチスレッドアプリケーションのUML図

シングルスレッドアプリケーションの場合、私はクラス図を使用して、そのアプリケーションのアーキテクチャの概要を取得します。ただし、このタイプの図は、マルチスレッド/コンカレントアプリケーションを理解しようとする場合にはあまり役に立ちませんでした。たとえば、クラスの異なるインスタンスが異なるスレッドで「ライブ」になっている(インスタンスへのアクセスは、それが住んでいるスレッド)。したがって、クラス間の関連付けは、必ずしもそれらのオブジェクトのメソッドを呼び出すことができるという意味ではありませんが、代わりに、ターゲットオブジェクトのスレッドでその呼び出しを行わなければなりません。

Designing Concurrent、Distributed、and Real-Time Applications with UMLby Hassan Gomaa などのトピックについて私が掘り起こしたほとんどの文献=スレッドの境界線をオブジェクト図に描画するなど、いくつかの素晴らしいアイデアがありましたが、全体的には少し学問的すぎて、本当に役に立たないようでした。

これらの図を問題ドメインの高レベルのビューとして使用するのではなく、クラス/オブジェクト、それらの相互作用、および前述のスレッド境界による制限の詳細な説明として使用します。

したがって、私は知りたいのですが:

  1. マルチスレッドアプリケーションを理解する上で、どの種類の図が最も役立つと思いましたか?
  2. マルチスレッドアプリケーションの特性を考慮した、クラシックUMLの拡張機能はありますか。それを説明する注釈を通して
    • 一部のオブジェクトは特定のスレッドに存在する可能性がありますが、他のオブジェクトにはスレッドアフィニティがありません。
    • オブジェクトの一部のフィールドは任意のスレッドから読み取ることができますが、書き込まれるのは1つのスレッドからのみです。
    • 同期して結果を返すメソッドもあれば、リクエストをキューに入れて別のスレッドのコールバックなどで結果を返す非同期メソッドもあります。
25
PersonalNexus

スレッドの実行がどのように行われるかについての最も重要な洞察は、シーケンス図として知られているものによって表すことができます。これが wikipedia の例です

enter image description here

この図は、基本的に、イベントのリストを、しばしばlifelineと呼ばれる垂直の1本の線上の方向とともに描画します。この場合、各スレッドはそれ自体の生存線の所有者です。この図では、同期、非同期など、あらゆるタイプのイベントを表現できます。

そのようなシステムで他に最も重要なことは、状態図または状態図です。通常、これはモデルがステートマシンとして表されている場合にのみ適用されます。ただし、ほとんどのマルチスレッドシステム(スレッドが重要な場合)では、さまざまな状態の分離アルゴリズムで機能するように設計するのが最善です。

相互作用図通信図のような他の図の種類がありますが、私は思いますシーケンス図状態図を描こうとすると、最大の明快さになります。

12
Dipan Mehta

私の答えは Dipan's を補完するものであり、UMLシーケンス図が含まれています。 100%純粋なUMLではないスタイルも問題ないことがわかりました。 Concurrency Patterns で使用されている図を見てください。一部はほぼUMLに似ています(ただし、これは間違いなく標準ではありません)。

enter image description here

Javaスレッドの同期)の待機/通知に精通している場合は、前述のドキュメントの次のシーケンス図が役立ちます。

enter image description here

6
Fuhrmanator

同じクラスを使用するマルチスレッドアプリケーションの場合、トリックは、スレッドを表す各モデルに同じクラスをドラッグアンドドロップすることです。同じクラスに異なるビューを設定し、クラス、図、またはコードをクリックすることで、モデルとコード内を移動できます。モデルのマージはよく知られた概念ではありませんが、Eclipse内でOmondoを使用すると非常にうまく機能します。

つまり、複数のプロジェクトで構成される大きなアプリケーションをモデル化する場合です。プロジェクトごとにモデルを作成し、それらをより大きなプロジェクト内にマージします。すべてのモデリングはクラスダイアグラムを使用して行われます。これは、JavaコードからUMLへのプロジェクト全体をリバースしたときに取得したモデルです。つまり、この例では既存のコードを使用してそれを単一にリバースしますUMLモデルを作成し、UMLモデルを作成したこのすべてのリバースコードを1つの大きなモデルにマージします。既存のコードをリバースするのではなく、複数のモデルを作成することもできます。これは、コードなしの作成時、または既存のコードを使用したリバースエンジニアリングの段階で機能します。

それが理にかなっているのかどうかはわかりませんが、1つの大きなモデルを作成して、マルチプロジェクトモデリングで行うように、各スレッドのサブモデルを再グループ化することはできますか?この助けを願っています。

0
UML_GURU