web-dev-qa-db-ja.com

UMLでC ++のネストされたクラスを表す方法は?

UMLでC++のネストされたクラスを表す方法は?クラスA {クラスB {}}

13
Victor S

スペックがクロスアンドサークル表記から外れたと思っていました。それで、私は仕様をあちこち歩き回っていましたが、2.0ではそれを見つけることができませんでした。 2.0仕様はもはやそれをサポートしていないと結論付けなければなりません。これは実際にはv1.4で指定されていますが、2.4.1仕様全体を調べましたが、どこにも見られません(実際、Wordの「アンカー」はドキュメント全体の検索で0の結果を返します)。私は他のいくつかの周りを見回しました、そしてこれが私がつなぎ合わせることができるものです。

まず、ネストされたクラスが構成を実装する手段であることを常に理解していました。さらに、UMLは実装に依存しないように試みますが、ネストされたクラスはそうではありません。 (他の方法でコンポジションを作成することもできます。すべてのOO言語がネストされたクラスをサポートするわけではありません。)

クラスBがクラスAの「アンカー」記号の付いた「アンカー」行によってクラスAに接続されている場合、クラスBはクラスAの名前空間内で宣言されます。つまり、クラスAとクラスBの関係が名前空間です。 -ownedElementアソシエーション。

OK。今UML2.0はこれを言います:

カーネルパッケージは、クラス、関連付け、パッケージなど、UMLのコアモデリングの概念を表します。

カーネルパッケージの図は次のとおりです。

enter image description here

これはかなり厄介ですが、左上のNamedElement抽象クラスを見てください。 (「NamedElement」クラスは名前を持つ要素です。)名前空間はそれから派生していることに注意してください。ここで、右側、名前空間クラスの上部のすぐ右側に、別のNamedElementクラスがあることに注意してください。関連付けの1つに{subsets ownedElement}プロパティがあり、名前空間の端に合成ダイヤモンドがあります。名前空間の端には、{subsetsowner}プロパティがあります。

これは、NamedElementが名前空間と構成で関連付けられている場合、名前空間のサブセットであることを意味します。言い換えると、NamespaceとNamedElementの関係は、1.4仕様で説明されているnamespace-ownedElementの関連付けです。したがって、コンポジション関係は、namespaceプロパティとownedElementプロパティで装飾されると、ネストされた(または内部、内部、またはお好みのコーディング言語で呼ばれている)クラスを表します。

したがって、コンポジション表記法を使用している場合、これはネストされたクラスを表示するために受け入れられている2.0の方法であると言います。このような:

enter image description here

ここで、別の方法は、ネストされたクラスをそれを含むクラス内に固定することです。仕様の表記例はこのAFAICSを示していませんが、他のNamedElements(パッケージ、コンポーネントなど)とともに示しているため、なぜできないのかわかりません。

しかし、アンカー表記が現在のものであるとは思いません。 xmojmrのお気に入りのサイト(そして良いサイトも)www.uml-diagrams.orgには、次のように書かれています。

廃止されたU​​ML 1.4.2仕様では、ネストされたクラスが別のクラス内で宣言され、宣言クラスの名前空間に属するクラスとして定義されました。これらのクラス間の関係は、「名前空間所有要素の関連付け」と呼ばれていました。

入れ子になった分類子。ネストされたクラス、ネストされたインターフェース、またはネストされたユースケースは、他の分類子と同じように使用できますが、包含クラスまたはインターフェース内でのみ使用できます。

UML 1.4.2に従って、宣言(ネスト)クラスとネストされたクラスは、宣言クラスに接続された端の「アンカー」アイコンを使用して、線で接続されて表示できます。アンカーアイコンは、円の中にある十字形です。

UML 2.x仕様(最近のUML 2.4.1を含む)では、入れ子の明示的な表記を提供せずに、構造化クラス内での分類子の入れ子について説明しています。 UMLの1.4「アンカー」表記は、UML 2.4.xの1つの例で、パッケージの「代替メンバーシップ表記」として、他の詳細や説明を提供せずに引き続き使用されていることに注意してください。

その「1つの例」の図が見つからなかったので、おそらくまだあります。しかし、少なくとも、この表記は非推奨のようです。プロパティを使用するか、<<nested>>ステレオタイプを作成するか、ネストされたクラスを所有者クラス内に配置します。

12
BobRodes

UML(任意の言語)のネストされたクラスは、次のように表すことができます。

enter image description here

ここに

  1. クラスInner1は、外部クラスOuter1内にネストされています
  2. クラスInner2、Inner3、Inner4クラスはOuter2内にネストされます

here からの参照

15
stamhaney

ネストされたクラスは、外部クラスのコンパートメント内に表示される場合があります。

nested-classes

UMLバージョン2.5.1仕様のセクション9.2.4.1には、次のように書かれています。

ClassifierがClassifiersであるownedMembersを持っている場合、適合ツールは、所有しているClassifierとそれらの関係を、所有するClassifierの長方形の個別のコンパートメント内に図式的にネストして表示するオプションを提供します。 (...)たとえば、クラスのネストされたプロパティ(11.4.2を参照)のコンテンツを示すコンパートメントは、「ネストされた分類子」と呼ばれます。

または、ネストされたクラスは、「サークルプラス」表記を使用して表示できます。

cpn

UML 2.5.1仕様のセクション7.4.4.1は次のように述べています。

適合ツールでは、オプションで、サブ条項12.2.4で定義されている「circle-plus」表記でパッケージメンバーシップを表示し、他の種類の名前空間のメンバーシップを表示することもできます(たとえば、nestedClassifiersを表示するため)。

(@stamhaneyによって投稿された回答から画像をコピーしました)

2