精通StarUML.docx
《精通StarUML.docx》由会员分享,可在线阅读,更多相关《精通StarUML.docx(18页珍藏版)》请在冰豆网上搜索。
精通StarUML
1. 综述:
StarUML是一种生成类图和其他类型的统一建模语言(UML)图表的工具。
这是一个用Java语言描述的创建类图的简明手册。
StarUML(简称SU),是一种创建UML类图,并能够自动生成Java的“stubcode”的工具。
SU也可以做JAVA逆向工程,以产生相应的UML图表。
在本教程中,我们将使用SU设计一个pizza饼。
执行下列步骤,可以创建如下面所示的UML图。
SU可以生成反映类结构的代码,而不是任何对象的具体行动。
因此,在使用SU创建图表后,你会为此stubcode添加剩余的功能性代码,填写每种方法本来应该做的事。
2. 安装:
首先,我们必须先安装将要使用的软件。
StarUML,是一个开放源码软件,遵循GPL协议许可(GNU公共许可证),并免费提供下载。
3. 启动
安装以后就可以启动该程序。
4. 添加新工程
然后,一个名叫:
NewProjectByApproach的对话框会弹出。
选择“EmptyProject”并且按下"确定"。
这里建议你不要勾选"设置为默认的做法"复选框。
5. 选择模块
在右边的“ModelExplorer”框中选定“Untitled”模块。
6. 添加模块
通过“Model”主菜单,或右击选定的模型,可以"Add/DesignModel"
7. 添加类图
通过“Model”主菜单,或右击选定模型,可以“AddDiagram/ClassDiagram”:
8. 设置profile
通过“Model/Profile...”菜单去设置工程所需的profile。
这决定了工程所使用的规则和约定。
一定要包含"JAVAPorfile"这一项目。
9. 保存工程
立即就保存工程,这样在出现问题的时候,您就不会丢失信息。
从“File”菜单,选择“Save”,并选择一个地方以保存工程。
你的StarUML项目现在应该看起来的是这样的:
9. 保存工程
立即就保存工程,这样在出现问题的时候,您就不会丢失信息。
从“File”菜单,选择“Save”,并选择一个地方以保存工程。
你的StarUML项目现在应该看起来的是这样的:
10. 创造图表
现在,开始真正创造图表,从默认就在屏幕的左边的“Toolbox”选择“类”图标,然后左键单击diagram窗口的某处。
这样就使用通用名字创造了一个新的类。
双击,将类改名为Circle。
11. 添加属性
右击图中的目标,在弹出菜单中选择“Add”中的“Attribute”(被标示为绿色),为其添加一个属性(或者域),填入期望的名字“_radius”。
l 具体的数据类型,在属性面板(右下侧的窗口),由双打字,在"类型"时段。
在窗体右下边的Properties面板中,找到“Type”输入框,输入double作为_radius属性的类型。
l 类的内部数据(域/属性)都是私有的,因为他们是严格由类内部使用的。
所以,在Properties面板中将_radius设置为“私有”。
12. 继续进行设计
重复同样的过程,添加所谓的名字叫做Rectangle的类和double型的私有成员_width和_height。
(下面者段话是使用方面的主意事项,总感觉翻译部太好,九原文搬上来了)Youmaynoticeusingthe"ModelExplorer"ontherightisfastertoaddthese,butdohowevernotethataddingtheclassesandinterfacesthemselvesinthistoolbox(insteadofusingthetoolboxontheleftandclickingonthepalettetocreatetheobject)willnotcreatetheobjectsinthediagram.
13. 创造IShapeinterface
l 从toolbox中,选择“Interface”,并点击图表的某处。
将其改名为IShape。
创建以后,选中它。
l 在顶部工具栏,选择“StereotypeDisplay”下拉按钮,将值改变为“None”。
这将改变以往的圆形形状,使其变为成长方形。
l 还是在顶部工具栏,取消选中"SuppressOperations"。
这将使我们能够看到接口所拥有的方法。
l 向IShape接口添加返回值为double的getArea方法。
n 可以通过右击interface的图标,在弹出菜单中点击红色的“Operation”按钮,然后输入getArea。
n 设定返回值类型。
在“ModelExplorer”中展开IShape节点,右击你刚刚创建的getArea方法,并选择“AddParameter”。
在“Properties”框中,将参数的名子变为空,将“DirectionKind”变为“RETURN”,将“Type”变为dboule。
l 将IShape和getArea的IsAbstract属性框打上勾,他们在图标上的名字将变为斜体。
这是UML的标准,表示这是接口或者其他纯虚实体。
14. 添加类和接口的关系
l 可以通过从toolbox中选择表示“Realization”的箭头,并从Circle拖拽向IShape,使Circle实现接口IShape。
重复同样的过程,为Rectangle添加实现关系。
这是添加了Circle和Rectangle对于IShape接口的实现关系。
n 如果想使连接线表现为直角的方式,右击连接线,并选择"Format/LineStyle/Rectilinear"菜单。
你通过这种方式,使箭头重叠在一起,可以使你的图看起来更整洁。
15. 添加类基于接口的行为
l 由于Circle和Rectangle类都实现了IShape接口,就必须有同样的行为(方法)。
n 在“ModelExplorer”面板中,复制getArea法(按Ctrl-C或者右键点击并选择Copy菜单),并粘贴到Circle和Rectangle类。
n 这些实现了的方法在Circle和Rectangle类中都不是抽象的,而是具体的。
这是因为他们实际上是执行一些特定行为(例如,为一个圆形和长方形分别计算面积),所以不要勾选IsAbstract框。
16. 你的图现在应该是这样的:
17. 添加Pizza类
l 向Pizza添加double型的私有域_price。
l 添加返回double类型的共有操作getPrice。
18. 为Pizza类添加IShape的引用
l 从toolbox中选择"DirectedAssociation"箭头,点击Pizza类,并向IShape拖拽。
n 选中箭头,在右边的“Properties”框上,将name一栏改为“has-a”,“End1.Aggregation”一栏改为“AGGREGATE”(这个图示说明Pizza和shape对象是“聚合“的关系)。
n 将“End2.Name”一栏改为_shape。
这样就自动为Pizza添加一个名字为_shape,使用IShape接口的私有域,的所谓_shape型ishape以pizza饼。
n 将“End2.Visibility”改为私有。
l 为_shape创建一个“获得者”方法,名字叫做getShape,返回IShape。
这就是创建一个行为,名字是getShape,返回IShape。
19. 为pizza类添加构造函数
l 为Pizza添加构造函数,右击,在弹出的“Add”菜单中选择“Operation”。
从这里,增加一个普通的带有dboule型price参数和IShape类型shape参数的操作
l 增加一个输入参数,就像之前增加了一个返回型的输出参数一样,你指定的参数的名称,如价格和形状等,以及适当的数据类型。
l 为Circle增加一个带有double型的radius参数的构造函数。
l 为Rectangle增加一个带有double型width和height参数的构造函数。
20. 你的图现在应该是这样的:
21. 添加Test_Pizza类
为了说明UML类图更多的功能,又增加了一个叫做“Test_Pizza”的类,它用作测试目的,并使用到Pizza和IShape类。
l 两个类之间的关系有多种形式。
举例来说,一个类可以实例化另一个类,而不是将其作为一个成员。
又或,一类的方法可能需要另一个类作为输入参数,保留一个引用仅仅是为这个方法的执行。
l 通过从toolbox中选择“Dependency”箭头,从一个类拖向他所以来的类,来添加不通类之间的依赖关系。
在这个例子中,Test_Pizza依赖于Pizza,Circle和Rectangle类,因为它实例化了它们。
l 从Propertiesbox选择name属性,或者双击图表上的“依赖线”,可以为依赖关系添加标签。
特别的是,当一类实例化另一个类,我们会把依赖线叫做“instantiates”。
l 你可以选中并拖动依赖线的标签,以达到更美观的效果。
l 依赖关系不会影响代码生成。
22. 你的图现在应该像本文最开始所示。
23. 对你的图随意做些修改。
你还可以拖动你的类图,并且使箭头以不通的方式展示(使箭头显示为直线,选择一个箭头,右击它,弹出菜单中选择“LineStyle”,并选择“Rectilinear”)。
你一定要体验这个工具,并去了解它。
24. 保存项目
在“File”菜单中,选择“Save”。
SU的所有资料只有一个单一的项目文件,所以你目前应该只有一个文件生成。
25. 导出
将图表导出为其他格式,例如图片等,是非常有用的。
您可以通过选择“File”菜单的“ExportDiagram”,并且选择合适的文件类型来执行改操作。
26. 生成Javastub代码:
l 点击主菜单的“Tools->Java”菜单,选择“GenerateCode”。
l 从对话框中选择你的模块(这里可能Model1),点击“Next”。
l 为了使你的模块或者图标的所有类都生成stubcode,选择“SelectAll”然后按“Next”。
l 选择一个有效的输出目录,“Next”。
l Inthe"OptionsSetup",besuretocheckboth"GeneratetheDocumentationbyJavaDoc"and"GenerateemptyJavaDoc".Allothercheckboxesshouldbeunchecked.Thenpress"Next".在“OptionsSetup”,请务必选中“GeneratetheDocumentationbyJavaDoc”,“GenerateemptyJavaDoc”,所有其他复选框不选中,“Next”。
l 现在StarUML将从你的图产生代码,点击“Finish”退出对话框。
l 现在,您可以编辑生成的代码,以增加应用。
27. 添加实现代码
现在就开始定义程序实际做的事情,例如,为你图标中的类描述添加实现代码。
l 使用DrJava添加代码,为相关的类,.Java文件添加代码。
代码会和你使用HW02是一样的。
(注意:
为Test_Pizza些代码,最好由DrJava自动生成,而非手工在StarUML里面创建。
我们这里只是为了说明。
)
l 记得那IShape的getArea()方法是抽象的,因此没有代码。
l 请您像代码范例一样添加注释。
这种注释是“JavaDoc”风格的。
关于JavaDoc您将会在随后学到更多。
28. 逆向工程
StarUML还可以从现有的Java代码创建一个类图,这被称为“reverseengineering”,当你想从现有的代码生成图表,或者你修改了SU生成的代码,并且想在图表中反应出来的时候,逆向工程功能就非常有用了。
通过图表或者DrJava这样的文本编辑器去反复工作的过程,称作“round-tripengineering”。
这也是面向对象变成中的一个基本过程。
l 到主菜单栏中选择“Tools/Java/ReverseEngineer...”,可以将现有的代码逆向工程。
l 选择Java代码所在的目录,并点击“Add”或“AddAll”按钮,将它们包括在逆向工程过程中,然后单击“Next”。
l 选择你想将类加入的模块,这里可能是“Model1”,然后“Next”。
l 在OptionSetup里面:
n 确认“public”,“package”,“protected”和“private”是选中的(这是默认设置)。
n 同样,在默认情况下,单选按钮“CreatethefieldtotheAttribute”也是选中的。
n 除非你想SU创建其他东西,例如布局很糟糕的包含所有类的图表,不要选中“CreateOverviewDiagram”框。
n 当你对选项做了检查后,点击“Run”。
n SUwillnowimporttheclassesintheselectedfilesintoyourmodel. Click"Finish"toexitthedialogwhenitiscomplete.苏现在进口班,在被选定的文件到你需要的产品型号,点击"完成"退出对话框时,就完成了。
l SU会向你的模块添加导入的类,但不是你的图表。
为了将它添加到您的图,只需要简单地从ModelExplorer拖动它们即可。
UML用例图中包含(include)、扩展(extend)和泛化(generalization)三种关系详解
2010-05-1113:
16
共性:
都是从现有的用例中抽取出公共的那部分信息,作为一个单独的用例,然后通后过不同的方法来重用这个公共的用例,以减少模型维护的工作量。
1、包含(include)
包含关系:
使用包含(Inclusion)用例来封装一组跨越多个用例的相似动作(行为片断),以便多个基(Base)用例复用。
基用例控制与包含用例的关系,以及被包含用例的事件流是否会插入到基用例的事件流中。
基用例可以依赖包含用例执行的结果,但是双方都不能访问对方的属性。
包含关系对典型的应用就是复用,也就是定义中说的情景。
但是有时当某用例的事件流过于复杂时,为了简化用例的描述,我们也可以把某一段事件流抽象成为一个被包含的用例;相反,用例划分太细时,也可以抽象出一个基用例,来包含这些细颗粒的用例。
这种情况类似于在过程设计语言中,将程序的某一段算法封装成一个子过程,然后再从主程序中调用这一子过程。
例如:
业务中,总是存在着维护某某信息的功能,如果将它作为一个用例,那新建、编辑以及修改都要在用例详述中描述,过于复杂;如果分成新建用例、编辑用例和删除用例,则划分太细。
这时包含关系可以用来理清关系。
对于一个扩展用例,可以在基用例上有几个扩展点。
例如,系统中允许用户对查询的结果进行导出、打印。
对于查询而言,能不能导出、打印查询都是一样的,导出、打印是不可见的。
导入、打印和查询相对独立,而且为查询添加了新行为。
因此可以采用扩展关系来描述:
4、泛化(generalization)
泛化关系:
子用例和父用例相似,但表现出更特别的行为;子用例将继承父用例的所有结构、行为和关系。
子用例可以使用父用例的一段行为,也可以重载它。
父用例通常是抽象的。
在实际应用中很少使用泛化关系,子用例中的特殊行为都可以作为父用例中的备选流存在。
例如,业务中可能存在许多需要部门领导审批的事情,但是领导审批的流程是很相似的,这时可以做成泛化关系表示:
上面是我参考的一篇文章,觉得将三种关系的区别讲得很清晰,在此基础上结合自己的系统,对项目(在线购物系统)的用例做了整体的描绘。
*****************************************************************
(1)系统整体用例图
按照先整体用例,后子系统用例来进行描绘的,欢迎大家提出好的建议!
转:
UML中扩展和泛化的区别
泛化表示类似于OO术语“继承”或“多态”。
UML中的UseCase泛化过程是将不同UseCase之间的可合并部分抽象成独立的父UseCase,并将不可合并部分单独成各自的子UseCase;包含以及扩展过程与泛化过程类似,但三者对用例关系的优化侧重点是不同的。
如下:
●泛化侧重表示子用例间的互斥性;
●包含侧重表示被包含用例对Actor提供服务的间接性;
●扩展侧重表示扩展用例的触发不定性;详述如下:
既然用例是系统提供服务的UML表述,那么服务这个过程在所有用例场景中是必然发生的,但发生按照发生条件可分为如下两种情况:
⒈无条件发生:
肯定发生的;
⒉有条件发生:
未必发生,发生与否取决于系统状态;
因此,针对用例的三种关系结合系统状态考虑,泛化与包含用例属于无条件发生的用例,而扩展属于有条件发生的用例。
进一步,用例的存在是为Actor提供服务,但用例提供服务的方式可分为间接和直接两种,依据于此,泛化中的子用例提供的是直接服务,而包含中的被包含用例提供的是间接服务。
同样,扩展用例提供的也是直接服务,但扩展用例的发生是有条件的。
另外一点需要提及的是:
泛化中的子用例和扩展中的扩展用例均可以作为基本用例事件的备选择流而存在。
2、扩展(extend)
扩展关系:
将基用例中一段相对独立并且可选的动作,用扩展(Extension)用例加以封装,再让它从基用例中声明的扩展点(ExtensionPoint)上进行扩展,从而使基用例行为更简练和目标更集中。
扩展用例为基用例添加新的行为。
扩展用例可以访问基用例的属性,因此它能根据基用例中扩展点的当前状态来判断是否执行自己。
但是扩展用例对基用例不可见。