web-dev-qa-db-ja.com

UMLクラス図で「1つのクラス内」の属性依存関係をモデル化する方法

私は次の「ソフトウェアの現実のソフトウェア現実」を持っています(これにもアクセスできません)。

  • 異なる属性を持つクラスClass1があります
    • AttributeA-すべての「通常の属性」を合計します
    • EnumType
    • データ・タイプ
    • AttributeValue

タイプClass1のいくつかのオブジェクトJohn ...が存在することが認識されているので、それらはすべてこれらの4つの属性を持っています。 GUIを介して設定できます。トリッキーな部分は次のとおりです。最初にEnumTypeを選択する必要があります。この選択に応じて、DataTypeの可能な選択肢が減る可能性があります。また、AttributeValueの「属性タイプ」は異なる場合があります。

  • EnumType = None => DataType:int | char && AttributeValue:フィールド
  • EnumType = List => DataType:int | char |ダブル|文字列&& AttributeValue:[] -Array
  • EnumType = Diction => DataType:int | char |ダブル|文字列| XML && AttributeValue:DictCollection

[2019-02-14の更新]:

  • AttributeValueValueに短縮しました。
  • 混乱を減らすために、ValueType 'String'は 'Field'に切り替えられました。
  • [] []-ArrayからDictCollectionに変更され、タイプがキーと値のペアのコレクションであることを明確にしました。すべてのキーはDataTypeから選択したものと同じですが、値のキーはDataTypeとは異なる場合があります[/ update]

例:Dictionの場合、多くのエントリが存在する可能性があります。各エントリは、可能なデータ型の(それぞれ独立した)エントリを持つ2つのフィールドで構成されます。 int | char |ダブル|文字列| XML。最初のフィールドはXML、2番目のフィールドはdoubleにすることができます。

[2019年2月14日更新]

e.g. JohnA: None=>Field | => char ='a' | AttributeA
JohnB: None=>Field | => int = 23 | AttributeA
JohnC: List=>[]Array | => String =["hello","world","list"] | ...
JohnD: Diction=>DictCollection | => {XML, double} = {(<length>, 2.34); (<width>, 5.43)} | ...

[2019-14-02に更新された画像]そのように表示しようとしました: class diagram with example values

私の質問:UMLでClass1をモデル化する方法

私の研究の読み:

私のケースにそれを採用しようとしました。記載されていないか、理解できません。 派生プロパティが私が探しているもののように聞こえます...それは単純な連結または計算ではありません。 まだ有効ですか?

追加情報:このClass1は、別のクラスでもその属性のデータ型として使用する必要があります-データ型として使用していることを確認する必要がある場合に備えてクラス構造と内部依存関係が影響を及ぼします。

私はこのアプローチを試しました:

  • 上の行は依存なしの「プレーン」で、私の「空白ページ」から始まります
  • すべての共通属性AttributeAを持つClass1
  • EnumTypeに関する特化
  • dataTypeの3つの列挙体とそれらを視覚的にリンクする(私の脳を並べ替えるために、最終ドラフトには何もないことを知っています)

このアプローチにはいくつかの問題があります:

  • EnumTypeはデフォルトにのみ設定され、「固定」されていません。このサブクラスがこの設定を要求するという依存関係はありません。
  • 同じAttributeValue
  • コンテンツが重複している複数の列挙がある

【2019-02-14更新画像】

modeling start and attempt

1
Shegit Brahm

UMLは階層ベースで構築されており、 [〜#〜] mof [〜#〜] はUMLメタモデルの分類子を定義し、UMLモデルはUMLメタモデルの分類子のインスタンスであり、オブジェクトは、UMLモデルの分類子のインスタンスです。

あなたの 'EnumType'は、それが制御しているインスタンスと同じレイヤーの型として機能しています。このレイヤーの交差は、UMLでは直接サポートされていません。それを表現したい場合は、型とインスタンスが同じモデル内で共存できる別の形式で作業する必要があります。

これは、Isterが例を示しているように、集中的な分類器ではなく広範な分類器を使用するなどの非公式な回避策の作成を妨げるものではありません。

1
Pete Kirkham

あなたは3つのサブクラスで正しい方向に進んでいます。それを派生属性と組み合わせ、メソッドを再定義して目的の効果を得ましょう。

プロパティがderivedの場合、その値は他の属性(特定のサブクラスが属している情報を含む)から計算できます。これは、 UML仕様ですが、当然の結果です)。

子のプロパティがredefinesproperty fromparentの場合、通常は詳細。考えられる明らかな再定義の1つは、属性のデータ型の変更です。この場合、変更はより広い(完全な)列挙型からより狭い列挙型になります。

すべてのサブクラスはすべての属性を持っている必要があるため、それらを親クラスClass1に保持します(ちなみに、これは抽象である必要があります)

現在、属性EnumTypeおよびAttributeValueの値は、選択したサブクラスに厳密に依存しているため、これらは派生属性です。また、サブクラス内では変更できないため、サブクラスでReadOnlyに設定して、この特定の値を効果的に適用するデフォルト値を提供できます。

DataTypeには、3つの列挙子があります。1つ(DataTypes)は最も広いリストを持ち、2つはDataTypesの特殊なバージョンで、それぞれがリストをさらに絞り込みます(それぞれDataTypesListおよびDataTypesNone)。この特殊化を、それぞれの一般化関係とともに表示することができます。

DataTypeの属性ClassDictionのタイプは、最も広範なバージョンのままであるため、そこで何も変更する必要はありません。他の2つの子クラスでは、狭い列挙でDataTypeを再定義します。

EnumTypeとAttributeValueの新しいバージョンも、制約とデフォルトを追加してParentクラスから元のバージョンを再定義しているため、適切なredefinesも必要です。

その結果、次の図が表示されます。

enter image description here

この図は説明した内容を正確に表していますが、もう少し高度なUMLを使用しています。誰が図を読むのかを常に考慮してください。すべての受信者がメッセージを確実に理解できるように正確に描写するのではなく、一部のテキスト説明(補足またはテキスト注釈/制約として)を追加する方が良い場合があります。

1
Ister