我有一个关于模块之间的类重复的问题。
我有一个包含 24 个类的大模块,并将其分为三个类,共 8 个。但是有一个类(“用户”)出现在两个模块中。我可以重复吗?我需要将属性放在两个模块中吗?
模块中类的最大理想是什么?
2 回答
实际上:在 UML 中,您确实可以多次描述一个类/或对象。而且,您不必显示所有成员(属性)。
描述类和关系的理想方式是,每个类都包含在一个包中,但是可以在同一个包或不同包中与其他类引用(具有某种关系)。
下面的图表实际上是可以的,并且是在 UML 中描述同一事物的几种方法我试图不让你混淆,有很多图表。
整个想法是,在 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 是一个指南,而不是一条严格的路径。
干杯。
很好的答案UMLcat。UML 可以在多个类图中重用相同的分类器。我的意思是,多年来 UML 与图形视图相关,有时在同一个视图中与所有项目分类器相关。
UML 元建模方法是简单地创建一个与图表实时同步的 UML 模型。在许多工具中,您都有图形表示和模型之间的映射器。例如,在 Eclipse 中,您有图形映射器 GMF,它调用模型映射器 EMF,然后创建 UML 模型。因此,不可能将 UML 视图与存储在硬盘上的 xmi 格式的 uml 模型实时同步。
几年前,Omondo EclipseUML 已经启动了这个元模型计划。它允许您创建尽可能多的图表,这些图表与磁盘上的 UML 模型实时同步,并立即保存为 XMI UML 2.3 格式。因此,您可以在不同的视图中重用相同的分类器,因为所有模型逻辑都在保存在磁盘上的 modell 中并实时同步。
往返工程不仅在代码和模型之间,而且在模型和元模型之间更深。它为 UML 提供了全部功能!