九、 Draw a Class Diagram
现在我们来画一个类图。类图和序列图是UML中最常用的两种diagram,所以我们要比之前的学习多花点时间。
这个类图着重在分析保龄球比赛和它的分数上,描述了一个保龄球比赛由10个Frame构成,除了最后一个Frame有三次掷球外,其它的每个Frame都只有两次掷球。首先,我们把类图的名字更改为“Analysis Class diagram”。
类图的工具条中有下面这些按钮。
现在让我们先画出轮廓,然后再添加详细的信息。首先需要创建六个类,你可以像创建Actor和用例一样去创建它们。从关联的两个类中下面那个类开始的箭头称作“Generalization”,当创建Generalizations的时候,需要先在开始目标上点击一下。
上面这个类图中的关联除了Generations外,还有一种虚线被称作“Associations”,现在让我们开始画这些Associations。在Game类和Frame类之间这种线被称作“Composition”,表明是Game是由Frame组成的,如果没有Frame,那也就不存在Game。
如何设置Association的Property
Association有很多property可以设置,比如:Aggregation、Composition、Multiplicity等等。在这个case中,你需要设置Game类的Composition。
- 方法1:拖拽工具面板上的Association按钮;
- 方法2:在Association的弹出菜单中设置;
- 方法3:在Association的Property视图中设置;
现在我们采用第二种方法,从弹出菜单中设置Association。
选择不同的association显示的弹出菜单也是不同的,点击结束于Game类的association连线,你就可以设置Game类的property了。
现在让我们在Property视图中设置Multiplicity,当在Diagram编辑器中选择Association时,这个Association的property就会显示在Property视图中(看下面的图例),然后你就可以修改Multiplicity了。
当你设置multiplicity时要注意这里针对association的不同目标显示了两个role选项卡,请确保你选择的是正确的。在这个case中,选择Target为“Frame”的选项卡,然后设置multiplicity为10。
现在让我们来给这些类添加属性和方法吧。
添加类属性
现在让我们给Frame类添加三个属性,我们可以通过三种方法执行该操作。
- 方法1:在Diagram编辑器中使用弹出菜单;
- 方法2:在project视图中使用弹出菜单;
- 方法3:使用这个类的Property视图;
在Diagram编辑器中选择Frame类,并且在它的弹出菜单中选择[Add Attribute],然后输入“Pin numbers on 1st throw”作为属性的名称,你可以使用同样方式添加更多的属性,也可以尝试使用另外两种方法作为练习。如果你想删除一个属性,你可以从Property视图或者结构树视图中去删除它们。属性的可见性默认为private,类型默认为void,你可以使用Property视图去改变他们。你还可以使用快捷键“Ctrl+F”添加属性(添加操作的快捷键是“Ctrl+M”)。
添加类方法
你可以像操作属性一样去添加或者编辑类的方法,也可以在Property视图中添加类的方法。
在Property视图中按下[Add]按钮即可添加方法,要编辑所添加方法的信息,可以使用Property视图或者选中所添加的方法点击[Edit]按钮,你就会看到非常详细的Property视图,可以编辑其中所有的信息,比如这个方法的参数。当选中某个方法时,按下[Delete]按钮就可以执行删除操作,按下[Edit]按钮就会打开一个编辑该方法所有Propety的对话框。使用[Up]和[Down]按钮可以调整方法显示的顺序。
当你添加完“Calculate knocked down pins”方法和“Pin numbers : int”属性后,该类图就完成了。到目前为止感觉如何?我们主要的目的是学习使用JUDE去画UML的diagram,所以不要担心技术细节,继续下个章节吧。
十、 Draw a Sequence diagram
现在让我们画一个序列图,显示组成Game类的“Calculate knocked down pin numbers”对象的操作时序。序列图可以在结构树视图中添加在用例或者操作的下面,选择“Calculate knocked down pin numbers”方法,然后在弹出菜单中选择[Add Sequence diagram]。
这个diagram描述了当“Player”掷出保龄球后一系列操作的时序。“Ball Throw Checker”对象首先计算击中了多少个保龄球,然后去“Game”对象进行登记,如果全部被击中的话,“Display the Score”对象就会显示一个动画。如果是画一个类似的活动图会有一些不同,在序列图中,是按时间顺序进行显示的,以竖坐标表示时间,横坐标表示不同的对象。
序列图的工具面板如下图:
序列图的工具面板中的按钮和我们之前看过的其它图的有一些不同,所以操作的元素也会和之前的图有所不同。
首先,按上图创建五个对象,先不要急于完成,我还想告诉你一些事情:我们可以像之前一样选择工具面板上的按钮去创建对象,但是在序列图中创建这些对象有更简便的方法,使用结构树视图!在结构树视图中选择基类,然后拖入Diagram编辑器中的序列图。
你也可以在结构树视图中选择多个类一次全部拖入Diagram编辑器中。
现在我们开始创建消息,从“Player”到“Ball Throw Checker”的消息是个异步消息,在工具面板上选择从左数第四个按钮,然后在“Player”的生命线上点击一下,再点击一下“Ball Checker”,消息就画出来了!双击名称“message0”将其更改为“Throw”,接下来创建消息“1.1 Count number of knocked down pins”,和创建“Throw”类似,我们选择工具面板上左数第三个按钮创建一个从“Ball Throw Checker”发往自己的同步消息(称作SelfMessage)。当你创建异步消息的时候,是点击在生命线上,但是创建同步消息时是点击在Activation上。
关联消息和操作
操作可以关联消息,例如,当一个操作的名称在类图中被更改时,如果该操作有被关联的消息,则消息也将自动被更改。要在消息和操作之间进行关联,选择消息后,在Property视图中设置操作。我们现在创建一个“Calculate numbers of knocked out pins”消息和操作之间的关联。
如果有些操作已经被关联到了发送消息的基类“Ball Throw Checker”,这些操作将会显示在Operation栏中,如果消息没有可关联的操作,你可以用Property视图中的[New]按钮添加一个目标操作,按下[Property]按钮将会显示出你所选择的操作的所有property,你可以修改它的名称和参数。你不需要总是对操作和消息进行关联,只要遵照其它图去确定操作和消息间的关联就可以了。现在让我们去创建其它的消息。
小提示:Activation的尺寸
你可能注意到每次添加或移动一个新消息时,Activation都变长了,这是因为在UML规范中要求原始Activation需要比接受消息的目标Activation要长,所以你每次添加了新消息时,JUDE都会自动进行调整。JUDE建议增长Activation而不让他们变短,你可以自己将它们变得短一点,你可以像在活动图中调整ActionState那样去改变Activation的大小,选择Activation,然后拖住它的一个角进行调整,这个方法适用于除异步外所有消息的Activation。
十一、Other Diagrams
这里有关于保龄球的协作图和状态图。
协作图
这个协作图表达了你之前画的序列图中的相互动作。
协作图工具面板
状态图
这个状态图显示了比赛是如何进行的。
状态图工具面板
十二、 Features of JUDE
JUDE有很多在这里没有介绍的特性,去尝试下面的这些特性:
- 导出Java骨架代码
- 导入Java源文件
- Java源文件生成模板
- 在结构树视图中拖拽替换Model
- Boundary、Control和Entity Classes的符号标记
- 设置元素的默认颜色
- 设置模式的默认颜色,可能在JUDE的系统属性中。
- 通过拖拽Association线的角改变Association的目标。
- 向Microsoft Office中贴图
- 导入JUDE的model。
《Learn UML with JUDE》系列文章到此就结束了,由于时间关系,有些地方翻译的还不够准确,有空的时候再来润色一下。JUDE当前最新的版本是5.5B1,但本文中所使用的版本是3.2,所以有些按钮或操作会和文中的描述有些出入,但也很容易对号入座。在翻译这篇文章的同时,也让我了解了JUDE的使用,确实是款出色的建模工具,推荐大家使用。