分类: LINUX
2010-04-24 22:01:19
本教程主要为了帮助您第一次起用BOUML。在这里仅显露BOUML少数的特点,而BOUML完整描述参见其参考手册。
本教程必须按序阅读,因为我不会每次重复诸如调用菜单等一般性的命令。
启动
当您执行BOUML出现下面消息, 按确定(OK)按钮。但你将不得不定义你自己的有效的BOUML标识:(1~127中的整数)。
在BOUML视窗显现(图样取决于使用的Qt版本,这里是在Linux下运行的2.4版本,与Windows版本兼容):
bouml窗口由三个部分组成:
u 左边的子窗口是一个展示您项目的浏览器,可由鼠标或上下左右键进行导航。 黑体的字体表示该项是可修改的,当您没有文件写权限时则一个项是只读。
u 右下角的子窗口是用来显示/修改与当前所选项相关联的注释。
u 右上方的部分是用来显示/修改图表,这些窗口可以的最大化或最小化。
显然地,个别子窗的大小会发生改变,当把鼠标放在它们之间的分拆处时,可以更改窗口大小。注意:如果你有双监视器配置,更好的办法是设置环境变量BOUML_LIMIT_DESKTOP,参见。
在此水平下你必须创建一个新的项目,或加载一个已经存在的项目。
创建一个新项目
这儿,我们创建一个新项目:在Project菜单中选择New菜单项,呈现一个文件对话框(它的外观取决于所用的系统和窗口管理器),请求输入项目名称,你必须选择一个目录用以存放项文件,并选择输入项目名字,我输入项目名为foo,放置在/ tmp目录之下:
在这种情况下BOUML 在/tmp下创建目录foo(即\tmp\foo),并将某些文件(包括foo.prj)
放置在/tmp/foo目录之下。当重新加载工程时(foo.prj),这些文件都会加载。
!注意: 不要重命名或删除由BOUML产生的文件,以及目录本身!
接着显示一个新的对话框:
遵循以下的建议,通过Language菜单我为此例切换为C + +和Java的语言(以后我们将看到为什么这样做):
该项目的名称显示在浏览器中,该项目是顶级包 ,其上点击鼠标右键产生的菜单:
你将看到,一个包(package)可能包含其他包和一些视图: 用例视图(use case view),类视图(class view),构件视图(component view)和部署视图(deployment view) 。
视图(View,) 用例(Use case)
Bouml在一个bouml工程中使用视图来组织和结构化模型元素和图。不同类型视图依据上下文提供不同的菜单,以列出在其中可以创建图和模型元素。若要定义用例,我们需要有一个用例视图(use case view) ,所以我们选择新的用例视图 (new use case view):
Bouml要求提供的视图名。在以后要想修改它,必须鼠标双击用例视图 (new use case view)
,或点鼠标右键出现菜单,从菜单中选择edit,则显示了用例编辑器。
图(Diagram)
要在此视图创建用例图(use case diagram) ,在用例视图上右击鼠标,弹出菜单,并选择
新的用例图(new use case diagram) :
同样还要输入用例图的名字。要修改用例图,在用例图上右击鼠标键,显示一菜单[此菜单为元素的关联菜单,以后简称关联菜单],从菜单中选择edit。相对于非图项,在图上双击显示。
在图中添加元素
在用例图中创建并放置用例你有两种方法可选 :
u 在用例视图右击鼠标,在菜单中选择新的用例(new use case) ,然后从浏览器拖放到图中。
u 或点击图子窗口顶上的用例功能(椭圆)按钮,然后在图中某个点点击鼠标即可。
.请注意, 用例是包含用例图的视图中创建的,除状态机(states machine.)外,不论何种图皆与此类似。
我们将用例的名字取为 Withdraw。
要移动图中的use case ,在use case上按鼠标左键,保持按下状态移动鼠标,用例名跟着用例移动 ,但用例名也可以独立移动。例如,将用例名放置在椭圆的中间。您也可以选中用例后使用键盘上的箭头移动。
创建一个名为Customer的角色如同你创建用例一样,结果如下:
请注意,一个角色(actor)其实是一个类 ,当板型是角色时,在浏览器中显示的图标是一个角色,否则是一个类。要改变板型,编辑类(在类上双击鼠标,或在类上点击鼠标右键出现的菜单,选择edit),从预定义列表中选择板型或输入一个新的板型。关于修改预定义的板型列表,请阅读参考手册。
用例可以改变大小:点击用例,移动的出现点即可。然而角色不能调整大小。
你有多种方法画出关联关系:UML的推荐(一条简单线条或有箭头),点击所需图标按钮,在角色上点击(不松开),移动鼠标到用例上,松开鼠标。
在最初的构建线条时,如果你在元素之外松开鼠标左键,线条变成折线。或在线条构建完成之后,在线上点击鼠标左键,拖动原线条亦变为折线。
要删除线上的一个点,双击此点,或右键单击此点显示菜单并选择remove from view菜单项。在线条的构建过程中,双击将终止构建。
同样方式在图中添加新元素,如下图(编辑依赖性以设置其板型)
正如你所看到的, 在浏览器上可见到范化(generalizations)和依赖(dependencies)关系,它们关联菜单(在其上鼠标右键单击)允许浏览到你要找的目标。
如果您从WithDraw来编辑泛化关联,将有一个简单的对话框,这与角色之间的泛化关系不是一回事,因为继承会产生源代码: 一个角色是一个类。
删除图中的一个元素
从图中删除一些元素,选择要删除元素(左键点击),然后按DEL或从关联菜单选择remove from view。请注意,不可能的删除图中的标签(label)。
删除/恢复浏览器中的元素
要从模型中删除元素,按ctrol+d或从关联菜单选择delete from model,,你也可以在浏览器中如此做。:例如删除的Administrator :
显然,Administrator 和generalization从图中消失,但在浏览器中并非如此:它们只是加上删除标记,相对应的菜单的也发生了改变。你可仅恢复(undelete) Administrator或者它和它的全部子孙(递归性恢复)。当Administrator被删除时,generalizationr 没有关联菜单,在Administrator被删除时,是不可以单单恢复它的子孙。
注意:所有删除的元素是不保存的,如果你重新调入工程,被删除的元素一定丢失了。
恢复角色和它的子孙,它们将不会在图中。
在图中再插入角色,使用拖放操作,把角色从浏览器中拖到图子窗口中,或点击图中的角色图标,再到图中的某一点点击,从所建议的列表中选择Administrator 。子孙并不自动绘制,但在类图中可能自动绘制(依赖于绘制设置 drawings settings)。要求绘制generalization,使用拖放操作从浏览器中拖到图中。
绘制设置(drawing settings)
通过设置drawing settings可以改变颜色和其它绘制特征。如果你总喜欢蓝色的用例,最好的方法是在工程关联菜单(也就是在浏览器的foo)上选择 edit drawing settings.转到最后一个标签(tab),改变默认的用例的颜色(default use case color)。 如果你在一个子级别上如此去做,例如在图上,新值的有效的范围将限于所选级别以及它的子孙,若此级设置的值是默认值,则继承上一级别所给出的值,除工程级别例外,因为它已经没有上一级。
这样,我们在工程一级修改用例的颜色为蓝色,则所有用例都是蓝色。我们在WithDraw上调用相关联的菜单,选择 edit drawing settings,将颜色(黙认值)改为绿色。
现在,在浏览器中的图上的关联菜单上,选择 duplicate (复制), 如此将开始复制此图,显示一对话框,要求为此复制品输入一个名字,按OK按钮,将打开此新图,它是一个复制品,编缉它的drawing settings ,使其用例为黄色显示,结果看到:
在图中选中元素
要在图中选中几个元素,以便于移动它们:
n control+a 选择全部元素
n 在contrl 键按下时,鼠标左击允许增加点元素或者从所选择的元素集中删除点元素
n 在任何元素之外的空白处鼠标左键按下并移动,它将定义一个矩形区域,其包含的元素都将选中。
n 在一个对象的菜单上选择 select linked items (链接在一起的) 菜单,允许你选择所有链接在一起的元素,实际上是吗(这里是所有的元素)?
z-dimension
在Diaggram2 上增加和删除元素,使之如是(图被最大化)
增加一个 subject ,调整尺寸,使之如是:
现在试着增加从 Transfer funds 到 Card identification 依赖性关联:你能吗?发生了什么?
因为你在Card identification 之后增加 subject, subject 在use case上面,BOUML考虑你试图建立从Transfer funds 到 subject 依存关系。
如果你改变subject 的颜色,可看的更明白。
不要惊慌,相对其他UML工具,您不必重做所有工作,仅只须调用subject的关联菜单,选择lower,现在您可以增加依赖性了。
放大,窗口尺寸,图的格式
当你打开一个图时,显示比例设为100%,窗口的尺寸不定。
当你改变比例时(使用小箭头或者直接在spin box写入值
箭头的尺寸不会改变,使之在小比例时可见,当比例较大时,一般不使用箭头。
虚线表明了图的范围(画布的尺寸),你在虚线外你能看到一些东西。黙认的图的格式是欧洲ISO-A4.要改变图的格式,从图的关联菜单中format (在浏览器中图的关联菜单不允许如此做)。格式‘A’相对于美国字符,‘B’相对于美国更大些,而‘C’则更大。设置图的格以便于以后使用,在主窗口的Miscellaneous菜单中选择子菜单Diagram default format。
fit% 使比例更大些,以便于看到图中的所有元素,比例的大小依赖于图子窗口尺寸。亦可在图的关联菜单上选择optimal scale 菜单项。
与此相对,在关联菜单上选择optimal window size,或通过按钮
关闭图,接着打开图,窗口的尺寸和比例将由默认值重置。要保存当前窗口的尺寸和比例,以便你在下一次重新打开时使用,可以使用图子窗口的关联菜单,选择set preferred size and scale 菜单项(浏览器中的菜单不可能使用)。
输出图的图片
这儿有几种方法输出图的图片:
l 打印:如需,打开图以显示图,使用bouml窗口左上方的打印机图标按钮。
l 复制:粘贴到其它程序:如需,打开图以显示图,可以使用图的关联菜单,选择opy visible picture part 菜单项(浏览器中不可能),可视部分是图的可见部分,依赖图子窗口的滚动条的位置。要复制所有的元素,甚至不可见的元素,选择copy optimal picture part.菜单项。
l 保存图像为PNG文件:如需,打开图以显示图,可以使用图的关联菜单,选择save visible picture part (png) 菜单项(浏览器中不可能)。要得到所有的元素,甚至不可见的元素,选择save optimal picture part (png).菜单项。
l 保存图像为SVG文件:如需,打开图以显示图,可以使用图的关联菜单,选择save visible picture part (svg)菜单项(浏览器中不可能)。要得到所有的元素,甚至不可见的元素,选择save optimal picture part (cvg) 菜单项。
l 使用plug-out,例如HTML 生成器。在此情况下,一个输出的图不是一个打开的图,保存部分的比例和尺寸是默认值,除非你使用了set preferred size and scale 做了特别说明。
子包、类视图、图图和类
现在我们想设计类以产生代码。
为此目的,我们首先创建一个类视图(class view),为什么不?我们不想将此视图直接放在项目包中。从项目的关联菜单中选择new package,菜单项,给包命名Package3 。从Package3 关联菜单上选择 new class view 菜单项,给类视图命名为 Class view4 :
要定义一类,类图不要一定需要的,除非需要加入关系。通过类视图创建一个类图,打开此图,如是:
按类图标的按钮,在图的某一个地方点击(也可在浏览器中使用class view菜单创建一个类), 给类命名为C1
因为角色是类,它们可以加入到类图中。使用拖动方法,从浏览器中拖到图子窗口中;或者点击类图标,显示一对话框,选择一个角色 Administrator ,角色类以一个角色方式绘制,对于具有Actor范型的类,这是默认绘制方式(这依赖于类的drawing settings设置,其它的特殊类是关于范型control,boundary 和entry):
然而在正常情况下,角色目的不是用于产生代码的。在生成设置中在类级别上的actor范型,目标语言在产生过程中忽略actor。 以下为取消此限制,编辑generation settings ,转到 stereotype 标签,在stereotype=actor行内,用C++和其它语言设置取代 ignored。
增加属性和操作
我们想定义一个命为att的属性和一个命为oper的操作。从类的关联菜单上选择执行add attribute,然后选择执行add operation 。当你通过图增加类的成员时,调用相关的编辑器,而不是浏览器。类的成员可见,类的图像如是:
因为默认的可见性由class settings 设置(属性为保护的而类是公开的)。而class settings 而在类视图级或包级别进行设置,遵循和drawing settings 同样的原则。
编辑属性
一旦决定att是一个整数,我们必须编辑此属性,可以有几种方法:在浏览器上双击属性;或者在浏览器调用此属性的关联菜单,选择edit项; 或在图上调用此属性的类的关联菜单,选edit attribute,再选择att , 你将看到一对话框:
第一个标签关心的是UML特征,一个属性默认为一个示例的成员(不是类的成员),不是易变的(volatile),也不是只读的(read-only)。其它的每一个标签连接到一个特定语言:使用bouml,你可以同时使用几种语言进行设计。例如HTML生成器是由C++和Java两者来实现的。
设置其类型为int ,通过从先前定义好的类型列表(通过generation settings可修改)中选择一个,或直接输入int。
转到C++标签 (在C++上点击):
正如你所见,C++的可见性默认是遵循UML的一个值,但这不强制性的,有助于那些具有不相同的可见性的情形(C++和Java),并且C++里属性可能是mutable。
在declaration 之前的文本是可修改的,而在result after substitution [替换后的结果]之前的文本则是不可修改,此文本由C++的生成器产生的源代码(假定你不修改它!)。除了由$()标记的关键字和由@()标记的用户的特性(用户属性名-值对集合)外,所有其它的字符将按原样生成,包括新行。$(type) 将由 int 替换而@(name) 将由 att 替换,这对你来说并不难理解。此两者的设置在UML标签内进行。这也意味着,如果你用 aze 替换$(type),在C++中关于att 的生成类型将是 aze 等等。。。
也许,你有自己的编码规则,例如在C++中属性的名字必须以‘_’开头,当然你可重新为属性命名为 _att , 但在类图中‘_’是不太美的,较好的方法是在$(name)之前加上‘_’:
转到Java 标签:
在Java标签内,应用相同的原则。
在这里是不可能看见IDL和Php的定义。为什么?回想一下,在本教程开始时我请求你在语言菜单上设置C++和Java选中开关,这样的话所有未选中的语言将被隐藏。按OK按钮关闭对话框,通过Languages菜单,选中所有语言,再来属性,转到IDL标签。
声明(declaration)是空的,这还是因为未在Languages 上设置Idl。按Default State declaration 按钮,我们有:
首先,的可见性是私有的而不是保护的,因protected在IDL中不存在。
其下,$(type) 由 long 替换,而不是int, 这也是因为在IDL中不存在int 类型,而最好目标类型是long, 太奇了!
它们都是由BOUML自动地转换类型,例如你在UML中选择any类型,你能在C++中得到Void类型,Java中得到Object 类型,而在ODL中得到 any类型。显然的这些转换不是硬编码完成的,而是可以用 generation settings 进行设置的。
转到Php标签,请求其默认的声明:
这是Php5的定义,如果你想使用Php4,最好的方法是针对package 改变可见性,则其定义将是:
关键字的定义(给出一一个默认的样子)也能够通过generation settings 进行修改。它允许你在C++的代码内在属性名前加上‘_’,如上所述。更多的说明,参阅手册。备注:当你更改generation settings ,已经存在的元素的定义并不改变。
按OK 校验更改的合法性。
类绘制设置 Class drawing settings
在类图中,仅可见到属性名和操作名,即见不到类型也不见其可见性,调用类的关联菜单,改变三个drawing settings 如下:
类的图像现在是这的:
不要犹豫,试一试其它的绘制设置,细节参阅参考手册。
关系
我们想增加一个从C1 指向 Administrator 单向关联:在图子窗口的顶上点击相应的图标,如同用例图中一样增加绘制此关系。
正如你所见,关联加入到了浏览器中,默认的,它的名字是
如同attributes 一样, 我们有UML标签和其它语言标签。
因关联是单向的,所以仅一极(关联的一极)是可编缉的。如同属性和操作,默认的可见性由Class settings 设定。角色名将产生成员名,我们发现已经存在属性的标志:从生成代码的观点来看,一个关联和属性之前没有差异。
给关联命名Admin ,转到C++标签:
默认情况下,在C++代码中,一个关联和一个聚合产生一个指针,由值给出的聚合将不会产生指针。显然,其默认的定义可通过generation settings 来改变。
转到Java 标签:
再转到Php标签:
再转到IDL标签:
回到UML标签,首先改变关系的类型为具有双向的关联,然后做其它的修改,使之如是:
转到C++标签,然后按 Default declaration 按钮,则有两极(两端):
转到Java标签,然后按 Default declaration 按钮,则有两极(两端):
转到IDL标签,然后按 Default declaration 按钮,则有两极(两端):
正如你所见到的,默认的定义依赖于关联的类型和关联的重数,当然这些默认值可通过generation settings 进行修改。
UML的范型相对于各语言来说都是屏蔽的(保护的),其实现可以通过generation settings 进行修改。下面你可见到,UML中vector 在C++中产生一个向量Vector,而在IDL中产生序列sequence。
按OK按钮,看图:
因为,现在关联是双向的,在浏览器中C1 and Administrator 中都可见到此关联。(我将它们标记为红色)
定义结构、联合、类型定义(typedef),枚举
要定义一个C++或ISDL的struc,使用类范型 struct , 使用Default declaration 按钮,针对相关的语言编辑类。在Java 中的struct 是通过一个标准的类来实现的,当然在UML的类范型到给定的语言的映射可以通过设置generation settings来完成,请看下面的对话框,并参阅参考手册。
要定义一个C++或IDL的联合,针对Class 使用Union 范型:
例如要在C++中定义typedef T,它是指向C1的一个指针:创建类T,绘制一个从T到C1的依赖关系。
编辑此类T,设置其范型为typedef:对话框中发生改变指向其基类型。
转到C++标签:
当然,依赖性不是强制的,例如可以定义 typedef int turlututu
在$(type)和$(name)之间増加一个’*’ :
通过enum 范型和 enum_pattern 范型以支持枚举。
创建一个类E,编辑E,设置其范型为enum,按OK。在浏览器中调用类的关联菜单,选择add item 并给一个名字a , 接着,重新调用类的关联菜单,选择add attribute ,并给一个名字 b。编辑类E,转到C++标签,请求黙认的声明:
正如你所见,$(item) 产生 a(这里’…’指明仅显示其名,而不是全部的定义)而不是b,这是因为在C++中,一个枚举仅仅有项,属性和方法都是不合法。
转至Java 标签,在至少JDK5的条件下,它是一个枚举。
b是由$(member)产生的,因为它的范型是attribute ,允许分开项目和属性。
转到Php标签,并不像C++那样,b不显示。
转到IDL标签,并不像C++那样,b不显示。
同样的方法,如果我们在enum中定义一个方法,则这个方法将在C++,Php,IDL实现中没有此方法。
现创建类OE,编辑OE,设置其范型为enum_pattern,按OK。查看OE关联菜单,它仅能增加items。E与OE在C++与IDL之间没有差异,但在Java里是完全不同的,因为这种类型的enum 是由类支持的。
我建议你编辑E和OE类中a, 要所有语言中查看其定义。
代码生成,部署视图,artifact
也许你在类的关联菜单中已经见过 Generate ,对于C1,试一试生成代码:无论何种语言,你将有下错误“C1:does not have associated artifact.”在UML2 中artifacts表示生成的文件,源文件,代码,库,执行文件,jar等,。。。。
[以下内容在最新版BOUML已经不存在,略过]