UMLとスレッド
「UMLとスレッド」
どういう関係だと思いますか?
※この記事の中では、混乱を防ぐため、スレッドは.NETのスレッドを指します。
UMLは、クラスと関連と属性のラフスケッチだと思っていませんか?
しかし、UMLの「オブジェクト」の概念には主体的に動作する、という考え方が含まれています。
今回は、それを知ってもらいたく記事を書きました。
クラスとスレッド
UMLの「クラス」には、「IsActive」という属性があります。
11.8.3.5 Attributes
• isActive : Boolean [1..1] = false Determines whether an object specified by this Class is active or not. If true, then the owning Class is referred to as an active Class. If false, then such a Class is referred to as a passive Class.
(UML仕様書 2.5 より引用)
ざっくりいうと、クラスには、IsActiveというBooleanのフラグがあり、このフラグがtrueだと「自律的に動く」いう意味です。
つまり、実装しようとするとスレッドのようなものがあるということです。
モデリングツール(astah*)でみると、↓これ、です。
ステートマシンとスレッド
UMLのステートマシン図は、オブジェクトのライフサイクル(人生)を示す図です。
オブジェクトの人生である以上、自然と独立したスレッドのようなものを前提としています。
例えば、状態には doアクティビティがありますが、これはその状態の間動き続けることが表現可能です。
下の図では、Running状態の間、データ収集を続けている可能性があります。
オブジェクトが動き続けているというイメージは、実装ではスレッドなどを使うことになりそうですね。
自律的なオブジェクトとそうでないもの
一般的に、人によるオブジェクトの認識は、次のようです。
- (A)生き物や電気などで動いているモノは自律的な動作をします。
- (B)書類や石などの無生物は自律的な動作をしません。
(A)をUMLで表現すると、クラスのIsActiveがtrueで、ステートマシン内にdo処理を持ち得ます。
(B)をUMLで表現すると、クラスのIsActiveはfalseで、ステートマシン内にdo処理を持ちません。
(A)のように動いているものは、Activeで状態によっては動き続けている。
(B)のように動かないものは、(たとえば書類に「承認前」や「承認済」状態があったとしても、)Activeではなく、動き続けていることはありません。
皆さん、ここの説明は、読めば読むほど「当たり前だろう」と感じているかも知れません。
では、この考え方に基づいてUMLのモデルを描き実装した経験のあるかたは、
どれだけいるのでしょうか。
実開発を振り返ると
実際の開発でも、自律的なオブジェクトとそうでないオブジェクトがあるはずです。
でも、普通は、どのオブジェクトのスレッドでどのオブジェクトが動くとか、あまり考えていないですよね。
仮に.NET開発ならば、
基本的にはUIスレッドで動かして、長い処理だけスレッドプールで動かすように、
実装時に帳尻合わせしているだけではないでしょうか?
その場合、自律的なオブジェクトもそうでないオブジェクトも、
どのスレッドで動いているのか、よく分かっていないけれど、プログラムは動いている、という感触ではありませんか。
もし、上述のようにオブジェクトとスレッドを意識して考え、それに基づいて実装すれば、
どのクラスのどの処理がどのスレッドで動くのかを、イメージしやすくなります。
皆さんの「当たり前」の感覚に近いスレッドで、クラス(オブジェクト)のプログラムコードが動くからです。
ここが、UMLモデリングを実装につなげる重要な点の1つなのです。
自律的でないものは、どのスレッドで動くのか?
自律的なオブジェクトは、自分のスレッドで動きますよね。
では、自律的でないオブジェクトは? との疑問が湧くのではないでしょうか。
いま、この文章が印刷された紙だとして仮定して、モデルにすると、たぶんこんな感じでしょう。
この図では、「読者」が自律的なオブジェクトで、「記事」は自律的でないオブジェクトです。
プログラミングしたときに、記事クラスのインスタンスがどのスレッドで動作するかと考えると、まずは「読者」のインスタンスのスレッドで動くと考えるのが自然かと考えられます。
オブジェクトとスレッドを結び付けた実装
ここまでは、概念的な話が多いので、なんとなく、うーん、そうだよな、と思っていただけたのではないかと思います。
でも、私たちはオブジェクト指向を開発に利用するために使っているので、設計実装できなければなりません。
これについては、続きの記事で書きたいと思います。書いたら、ここにリンクを入れます。
ではまた。
リンク追記しました ⇒ UMLとスレッドの実装