0

モジュール間のクラスの繰り返しについて質問があります。
私は24のクラスを持つ大きなモジュールを持っていて、それを8つの3つのクラスに分割しました。しかし、2つのモジュールに現れるクラス(「ユーザー」)があります。繰り返すことができますか?そして、両方のモジュールに属性を配置する必要がありますか?
そして、モジュール内のクラスの最大の理想は何ですか?

4

2 に答える 2

4

実際には、UMLでは、クラスやオブジェクトを何度も記述することができます。また、すべてのメンバー(プロパティ)を表示する必要はありません。

クラスと関係を説明する理想的な方法は、各クラスがパッケージに含まれているが、同じパッケージまたは異なるパッケージのいずれかで他のクラスと参照(何らかの関係を持つ)できることです。

次の図は、実際には問題ありません。多くの図を使用して、混乱しないようにUMLImで同じことを説明するいくつかの方法があります。

全体的なアイデアは、UMLでは、同じアイデアを記述またはモデル化するためのいくつかの選択肢があるかもしれないということです。

図1.同じパッケージ内の完全に記述されたクラスの例。

...................................................................................
..+--------------------+...........................................................
..|..Streams...........|...........................................................
..+--------------------+---------------------------------------------------------+.
..|..............................................................................|.
..|.+----------------------------------+....+----------------------------------+.|.
..|.|            StreamClass           |....|          ReaderClass             |.|.
..|.+----------------------------------+....+----------------------------------+.|.
..|.| [#] void Read()     <<abstract>> |....| [+] void Read()     <<override>> |.|.
..|.| [#] void Write()    <<abstract>> +<---+ [+] bool CanRead()  <<override>> |.|.
..|.| [+] bool CanRead()  <<virtual>>  |....| [+] bool CanWrite() <<override>> |.|.
..|.| [+] bool CanWrite() <<virtual>>  |....| [+] bool CanRead()  <<virtual>>  |.|.
..|.+----------------------------------+....+----------------------------------+.|.
..|..............................................................................|.
..+------------------------------------------------------------------------------+.
...................................................................................

図2.不要なメンバーを省略した同じパッケージ内のクラスの例

....................................................................................
..+--------------------+............................................................
..|..Streams...........|............................................................
..+--------------------+----------------------------------------------------------+.
..|...............................................................................|.
..|.+----------------------------------+....+----------------------------------+..|.
..|.|            StreamClass           |....|          ReaderClass             |..|.
..|.+----------------------------------+....+----------------------------------+..|.
..|.| [#] void Read()     <<abstract>> |....| [+] void Read()     <<override>> |..|.
..|.| [#] void Write()    <<abstract>> +<---+ [+] bool CanRead()  <<override>> |..|.
..|.| [+] bool CanRead()  <<virtual>>  |....| [+] bool CanWrite() <<override>> |..|.
..|.| [+] bool CanWrite() <<virtual>>  |....+----------------------------------+..|.
..|.+----------------------------------+..........................................|.
..|...............................................................................|.
..+-------------------------------------------------------------------------------+.
....................................................................................

図3.さまざまなパッケージのクラスの例

...................................................................................
.+--------------------+...................+--------------------+...................
.|..Streams...........|...................|..Readers...........|...................
.+--------------------+-----------------+.+--------------------+-----------------+.
.|......................................|.|..|...................................|.
.|.+----------------------------------+.|.|.+----------------------------------+.|.
.|.|            StreamClass           |.|.|.|          ReaderClass             |.|.
.|.+----------------------------------+.|.|.+----------------------------------+.|.
.|.| [#] void Read()     <<abstract>> |.|.|.| [+] void Read()     <<override>> |.|.
.|.| [#] void Write()    <<abstract>> +<----+ [+] bool CanRead()  <<override>> |.|.
.|.| [+] bool CanRead()  <<virtual>>  |.|.|.| [+] bool CanWrite() <<override>> |.|.
.|.| [+] bool CanWrite() <<virtual>>  |.|.|.+----------------------------------+.|.
.|.+----------------------------------+.|.|......................................|.
.|......................................|.|......................................|.
.+--------------------------------------+.+--------------------------------------+..
...................................................................................

パッケージは、クラス図で省略されているか、同じパッケージに含まれていると見なされる場合があります。

図4.パッケージなしで完全に記述されたクラスの例。

................................................................................
..+----------------------------------+....+----------------------------------+..
..|            StreamClass           |....|          ReaderClass             |..
..+----------------------------------+....+----------------------------------+..
..| [#] void Read()     <<abstract>> |....| [+] void Read()     <<override>> |..
..| [#] void Write()    <<abstract>> +<---+ [+] bool CanRead()  <<override>> |..
..| [+] bool CanRead()  <<virtual>>  |....| [+] bool CanWrite() <<override>> |..
..| [+] bool CanWrite() <<virtual>>  |....+----------------------------------+..
..+----------------------------------+..........................................
................................................................................

そして最後に、各クラスは、コンテナがパッケージ化された状態で完全に記述されている場合と、リレーションのみが表示される図が含まれている場合があります。次の3つの図は、3つの補足図を表しています。

図5.1単一クラスの例。

...........................................
..+--------------------+...................
..|..Streams...........|...................
..+--------------------+-----------------+.
..|......................................|.
..|.+----------------------------------+.|.
..|.|            StreamClass           |.|.
..|.+----------------------------------+.|.
..|.| [#] void Read()     <<abstract>> |.|.
..|.| [#] void Write()    <<abstract>> |.|.
..|.| [+] bool CanRead()  <<virtual>>  |.|.
..|.| [+] bool CanWrite() <<virtual>>  |.|.
..|.+----------------------------------+.|.
..|......................................|.
..+--------------------------------------+.
...........................................

図5.2単一クラスの例。

...........................................
..+--------------------+...................
..|..Readers...........|...................
..+--------------------+-----------------+.
..|......................................|.
..|.+----------------------------------+.|.
..|.|            ReaderClass           |.|.
..|.+----------------------------------+.|.
..|.| [#] void Write()    <<abstract>> |.|.
..|.| [#] void Read()     <<override>> |.|.
..|.| [+] bool CanRead()  <<override>> |.|.
..|.| [+] bool CanWrite() <<override>> |.|.
..|.+----------------------------------+.|.
..|......................................|.
..+--------------------------------------+.
...........................................

図5.3クラス間の関係の例。

................................................................................
..+----------------------------------+....+----------------------------------+..
..|            StreamClass           +<---+          ReaderClass             |..
..+----------------------------------+....+----------------------------------+..
................................................................................

概要

UMLはガイドであり、厳密なパスではないことを忘れないでください。

乾杯。

于 2012-05-24T17:13:37.327 に答える
0

良い答えUMLcat。UMLは、同じ分類子を複数のクラス図で再利用できます。つまり、UMLは何年もの間、グラフィカルビューに関連しており、同じビュー内ですべてのプロジェクト分類子に関連していることもありました。

UMLメタモデリングのアプローチは、ダイアグラムとライブ同期されるUMLモデルを作成することです。多くのツールでは、グラフィック表示とモデルの間にマッパーがあります。たとえば、Eclipseでは、モデルマッパーEMFを呼び出してUMLモデルを作成するグラフィカルマッパーGMFがあります。したがって、UMLビューをハードディスクにxmi形式で保存されているumlモデルとライブ同期することはできません。

Omondo EclipseUMLは、数年前にこのmetamodedlイニシアチブを開始しました。これにより、XMIUML2.3形式ですぐに保存されたディスク上のUMLモデルとライブ同期される図をいくつでも作成できます。したがって、すべてのモデルロジックがディスクに保存されたmodedlにあり、ライブ同期されるため、同じ分類子を異なるビューで再利用できます。

ラウンドトリップエンジニアリングは、コードとモデルの間だけでなく、モデルとメタモデルの間でも深く関わっています。それはUMLにフルパワーを与えます!!

于 2012-05-26T09:18:12.813 に答える