BOUML教程.docx
《BOUML教程.docx》由会员分享,可在线阅读,更多相关《BOUML教程.docx(44页珍藏版)》请在冰豆网上搜索。
BOUML教程
Bouml-教程
本教程主要为了帮助您第一次起用BOUML。
在这里仅显露BOUML少数的特点,而BOUML完整描述参见其参考手册。
本教程必须按序阅读,因为我不会每次重复诸如调用菜单等一般性的命令。
启动
当您执行BOUML出现下面消息,按确定(OK)按钮。
但你将不得不定义你自己的有效的BOUML标识:
(1~127中的整数)。
在BOUML视窗显现(图样取决于使用的Qt版本,这里是在Linux下运行的2.4版本,与Windows版本兼容):
bouml窗口由三个部分组成:
◆左边的子窗口是一个展示您项目的浏览器,可由鼠标或上下左右键进行导航。
黑体的字体表示该项是可修改的,当您没有文件写权限时则一个项是只读。
◆右下角的子窗口是用来显示/修改与当前所选项相关联的注释。
◆右上方的部分是用来显示/修改图表,这些窗口可以的最大化或最小化。
显然地,个别子窗的大小会发生改变,当把鼠标放在它们之间的分拆处时,可以更改窗口大小。
注意:
如果你有双监视器配置,更好的办法是设置环境变量BOUML_LIMIT_DESKTOP,参见此地。
在此水平下你必须创建一个新的项目,或加载一个已经存在的项目。
创建一个新项目
这儿,我们创建一个新项目:
在Project菜单中选择New菜单项,呈现一个文件对话框(它的外观取决于所用的系统和窗口管理器),请求输入项目名称,你必须选择一个目录用以存放项文件,并选择输入项目名字,我输入项目名为foo,放置在/tmp目录之下:
在这种情况下BOUML在/tmp下创建目录foo(即\tmp\foo),并将某些文件(包括foo.prj)
放置在/tmp/foo目录之下。
当重新加载工程时(foo.prj),这些文件都会加载。
!
注意:
不要重命名或删除由BOUML产生的文件,以及目录本身!
接着显示一个新的对话框:
遵循以下的建议,通过Language菜单我为此例切换为C++和Java的语言(以后我们将看到为什么这样做):
该项目的名称显示在浏览器中,该项目是顶级包,其上点击鼠标右键产生的菜单:
你将看到,一个包(package)可能包含其他包和一些视图:
用例视图(usecaseview),类视图(classview),构件视图(componentview)和部署视图(deploymentview)。
视图(View,)用例(Usecase)
Bouml在一个bouml工程中使用视图来组织和结构化模型元素和图。
不同类型视图依据上下文提供不同的菜单,以列出在其中可以创建图和模型元素。
若要定义用例,我们需要有一个用例视图(usecaseview),所以我们选择新的用例视图(newusecaseview):
Bouml要求提供的视图名。
在以后要想修改它,必须鼠标双击用例视图(newusecaseview)
,或点鼠标右键出现菜单,从菜单中选择edit,则显示了用例编辑器。
图(Diagram)
要在此视图创建用例图(usecasediagram),在用例视图上右击鼠标,弹出菜单,并选择
新的用例图(newusecasediagram):
同样还要输入用例图的名字。
要修改用例图,在用例图上右击鼠标键,显示一菜单[此菜单为元素的关联菜单,以后简称关联菜单],从菜单中选择edit。
相对于非图项,在图上双击显示。
在图中添加元素
在用例图中创建并放置用例你有两种方法可选:
◆在用例视图右击鼠标,在菜单中选择新的用例(newusecase),然后从浏览器拖放到图中。
◆或点击图子窗口顶上的用例功能(椭圆)按钮,然后在图中某个点点击鼠标即可。
.请注意,用例是包含用例图的视图中创建的,除状态机(statesmachine.)外,不论何种图皆与此类似。
我们将用例的名字取为Withdraw。
要移动图中的usecase,在usecase上按鼠标左键,保持按下状态移动鼠标,用例名跟着用例移动,但用例名也可以独立移动。
例如,将用例名放置在椭圆的中间。
您也可以选中用例后使用键盘上的箭头移动。
创建一个名为Customer的角色如同你创建用例一样,结果如下:
请注意,一个角色(actor)其实是一个类,当板型是角色时,在浏览器中显示的图标是一个角色,否则是一个类。
要改变板型,编辑类(在类上双击鼠标,或在类上点击鼠标右键出现的菜单,选择edit),从预定义列表中选择板型或输入一个新的板型。
关于修改预定义的板型列表,请阅读参考手册。
用例可以改变大小:
点击用例,移动的出现点即可。
然而角色不能调整大小。
你有多种方法画出关联关系:
UML的推荐(一条简单线条或有箭头),点击所需图标按钮,在角色上点击(不松开),移动鼠标到用例上,松开鼠标。
在最初的构建线条时,如果你在元素之外松开鼠标左键,线条变成折线。
或在线条构建完成之后,在线上点击鼠标左键,拖动原线条亦变为折线。
要删除线上的一个点,双击此点,或右键单击此点显示菜单并选择removefromview菜单项。
在线条的构建过程中,双击将终止构建。
同样方式在图中添加新元素,如下图(编辑依赖性以设置其板型)
正如你所看到的,在浏览器上可见到范化(generalizations)和依赖(dependencies)关系,它们关联菜单(在其上鼠标右键单击)允许浏览到你要找的目标。
如果您从WithDraw来编辑泛化关联,将有一个简单的对话框,这与角色之间的泛化关系不是一回事,因为继承会产生源代码:
一个角色是一个类。
删除图中的一个元素
从图中删除一些元素,选择要删除元素(左键点击),然后按DEL或从关联菜单选择removefromview。
请注意,不可能的删除图中的标签(label)。
删除/恢复浏览器中的元素
要从模型中删除元素,按ctrol+d或从关联菜单选择deletefrommodel,,你也可以在浏览器中如此做。
:
例如删除的Administrator:
显然,Administrator和generalization从图中消失,但在浏览器中并非如此:
它们只是加上删除标记,相对应的菜单的也发生了改变。
你可仅恢复(undelete)Administrator或者它和它的全部子孙(递归性恢复)。
当Administrator被删除时,generalizationr没有关联菜单,在Administrator被删除时,是不可以单单恢复它的子孙。
注意:
所有删除的元素是不保存的,如果你重新调入工程,被删除的元素一定丢失了。
恢复角色和它的子孙,它们将不会在图中。
在图中再插入角色,使用拖放操作,把角色从浏览器中拖到图子窗口中,或点击图中的角色图标,再到图中的某一点点击,从所建议的列表中选择Administrator。
子孙并不自动绘制,但在类图中可能自动绘制(依赖于绘制设置drawingssettings)。
要求绘制generalization,使用拖放操作从浏览器中拖到图中。
绘制设置(drawingsettings)
通过设置drawingsettings可以改变颜色和其它绘制特征。
如果你总喜欢蓝色的用例,最好的方法是在工程关联菜单(也就是在浏览器的foo)上选择editdrawingsettings.转到最后一个标签(tab),改变默认的用例的颜色(defaultusecasecolor)。
如果你在一个子级别上如此去做,例如在图上,新值的有效的范围将限于所选级别以及它的子孙,若此级设置的值是默认值,则继承上一级别所给出的值,除工程级别例外,因为它已经没有上一级。
这样,我们在工程一级修改用例的颜色为蓝色,则所有用例都是蓝色。
我们在WithDraw上调用相关联的菜单,选择editdrawingsettings,将颜色(黙认值)改为绿色。
现在,在浏览器中的图上的关联菜单上,选择duplicate(复制),如此将开始复制此图,显示一对话框,要求为此复制品输入一个名字,按OK按钮,将打开此新图,它是一个复制品,编缉它的drawingsettings,使其用例为黄色显示,结果看到:
在图中选中元素
要在图中选中几个元素,以便于移动它们:
⏹control+a选择全部元素
⏹在contrl键按下时,鼠标左击允许增加点元素或者从所选择的元素集中删除点元素
⏹在任何元素之外的空白处鼠标左键按下并移动,它将定义一个矩形区域,其包含的元素都将选中。
⏹在一个对象的菜单上选择selectlinkeditems(链接在一起的)菜单,允许你选择所有链接在一起的元素,实际上是吗(这里是所有的元素)?
z-dimension
在Diaggram2上增加和删除元素,使之如是(图被最大化)
增加一个subject,调整尺寸,使之如是:
现在试着增加从Transferfunds到Cardidentification依赖性关联:
你能吗?
发生了什么?
因为你在Cardidentification之后增加subject,subject在usecase上面,BOUML考虑你试图建立从Transferfunds到subject依存关系。
如果你改变subject的颜色,可看的更明白。
不要惊慌,相对其他UML工具,您不必重做所有工作,仅只须调用subject的关联菜单,选择lower,现在您可以增加依赖性了。
放大,窗口尺寸,图的格式
当你打开一个图时,显示比例设为100%,窗口的尺寸不定。
当你改变比例时(使用小箭头或者直接在spinbox写入值
)[实际上是回到100%]。
箭头的尺寸不会改变,使之在小比例时可见,当比例较大时,一般不使用箭头。
虚线表明了图的范围(画布的尺寸),你在虚线外你能看到一些东西。
黙认的图的格式是欧洲ISO-A4.要改变图的格式,从图的关联菜单中format(在浏览器中图的关联菜单不允许如此做)。
格式‘A’相对于美国字符,‘B’相对于美国更大些,而‘C’则更大。
设置图的格以便于以后使用,在主窗口的Miscellaneous菜单中选择子菜单Diagramdefaultformat。
fit%使比例更大些,以便于看到图中的所有元素,比例的大小依赖于图子窗口尺寸。
亦可在图的关联菜单上选择optimalscale菜单项。
与此相对,在关联菜单上选择optimalwindowsize,或通过按钮
,你能够自动改变图子窗口的尺寸,以便在当前比例下看到所有元素。
关闭图,接着打开图,窗口的尺寸和比例将由默认值重置。
要保存当前窗口的尺寸和比例,以便你在下一次重新打开时使用,可以使用图子窗口的关联菜单,选择setpreferredsizeandscale菜单项(浏览器中的菜单不可能使用)。
输出图的图片
这儿有几种方法输出图的图片:
●打印:
如需,打开图以显示图,使用bouml窗口左上方的打印机图标按钮。
●复制:
粘贴到其它程序:
如需,打开图以显示图,可以使用图的关联菜单,选择opyvisiblepicturepart菜单项(浏览器中不可能),可视部分是图的可见部分,依赖图子窗口的滚动条的位置。
要复制所有的元素,甚至不可见的元素,选择copyoptimalpicturepart.菜单项。
●保存图像为PNG文件:
如需,打开图以显示图,可以使用图的关联菜单,选择savevisiblepicturepart(png)菜单项(浏览器中不可能)。
要得到所有的元素,甚至不可见的元素,选择saveoptimalpicturepart(png).菜单项。
●保存图像为SVG文件:
如需,打开图以显示图,可以使用图的关联菜单,选择savevisiblepicturepart(svg)菜单项(浏览器中不可能)。
要得到所有的元素,甚至不可见的元素,选择saveoptimalpicturepart(cvg)菜单项。
●使用plug-out,例如HTML生成器。
在此情况下,一个输出的图不是一个打开的图,保存部分的比例和尺寸是默认值,除非你使用了setpreferredsizeandscale做了特别说明。
子包、类视图、图图和类
现在我们想设计类以产生代码。
为此目的,我们首先创建一个类视图(classview),为什么不?
我们不想将此视图直接放在项目包中。
从项目的关联菜单中选择newpackage,菜单项,给包命名Package3。
从Package3关联菜单上选择newclassview菜单项,给类视图命名为Classview4:
要定义一类,类图不要一定需要的,除非需要加入关系。
通过类视图创建一个类图,打开此图,如是:
按类图标的按钮,在图的某一个地方点击(也可在浏览器中使用classview菜单创建一个类),给类命名为C1
因为角色是类,它们可以加入到类图中。
使用拖动方法,从浏览器中拖到图子窗口中;或者点击类图标,显示一对话框,选择一个角色Administrator,角色类以一个角色方式绘制,对于具有Actor范型的类,这是默认绘制方式(这依赖于类的drawingsettings设置,其它的特殊类是关于范型control,boundary和entry):
然而在正常情况下,角色目的不是用于产生代码的。
在生成设置中在类级别上的actor范型,目标语言在产生过程中忽略actor。
以下为取消此限制,编辑generationsettings,转到stereotype标签,在stereotype=actor行内,用C++和其它语言设置取代ignored。
增加属性和操作
我们想定义一个命为att的属性和一个命为oper的操作。
从类的关联菜单上选择执行addattribute,然后选择执行addoperation。
当你通过图增加类的成员时,调用相关的编辑器,而不是浏览器。
类的成员可见,类的图像如是:
因为默认的可见性由classsettings设置(属性为保护的而类是公开的)。
而classsettings而在类视图级或包级别进行设置,遵循和drawingsettings同样的原则。
编辑属性
一旦决定att是一个整数,我们必须编辑此属性,可以有几种方法:
在浏览器上双击属性;或者在浏览器调用此属性的关联菜单,选择edit项;或在图上调用此属性的类的关联菜单,选editattribute,再选择att,你将看到一对话框:
第一个标签关心的是UML特征,一个属性默认为一个示例的成员(不是类的成员),不是易变的(volatile),也不是只读的(read-only)。
其它的每一个标签连接到一个特定语言:
使用bouml,你可以同时使用几种语言进行设计。
例如HTML生成器是由C++和Java两者来实现的。
设置其类型为int,通过从先前定义好的类型列表(通过generationsettings可修改)中选择一个,或直接输入int。
转到C++标签(在C++上点击):
正如你所见,C++的可见性默认是遵循UML的一个值,但这不强制性的,有助于那些具有不相同的可见性的情形(C++和Java),并且C++里属性可能是mutable。
在declaration之前的文本是可修改的,而在resultaftersubstitution[替换后的结果]之前的文本则是不可修改,此文本由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。
按DefaultStatedeclaration按钮,我们有:
首先,的可见性是私有的而不是保护的,因protected在IDL中不存在。
其下,$(type)由long替换,而不是int,这也是因为在IDL中不存在int类型,而最好目标类型是long,太奇了!
它们都是由BOUML自动地转换类型,例如你在UML中选择any类型,你能在C++中得到Void类型,Java中得到Object类型,而在ODL中得到any类型。
显然的这些转换不是硬编码完成的,而是可以用generationsettings进行设置的。
转到Php标签,请求其默认的声明:
这是Php5的定义,如果你想使用Php4,最好的方法是针对package改变可见性,则其定义将是:
关键字的定义(给出一一个默认的样子)也能够通过generationsettings进行修改。
它允许你在C++的代码内在属性名前加上‘_’,如上所述。
更多的说明,参阅手册。
备注:
当你更改generationsettings,已经存在的元素的定义并不改变。
按OK校验更改的合法性。
类绘制设置Classdrawingsettings
在类图中,仅可见到属性名和操作名,即见不到类型也不见其可见性,调用类的关联菜单,改变三个drawingsettings如下:
类的图像现在是这的:
不要犹豫,试一试其它的绘制设置,细节参阅参考手册。
关系
我们想增加一个从C1指向Administrator单向关联:
在图子窗口的顶上点击相应的图标,如同用例图中一样增加绘制此关系。
正如你所见,关联加入到了浏览器中,默认的,它的名字是编辑此关联:
如同attributes一样,我们有UML标签和其它语言标签。
因关联是单向的,所以仅一极(关联的一极)是可编缉的。
如同属性和操作,默认的可见性由Classsettings设定。
角色名将产生成员名,我们发现已经存在属性的标志:
从生成代码的观点来看,一个关联和属性之前没有差异。
给关联命名Admin,转到C++标签:
默认情况下,在C++代码中,一个关联和一个聚合产生一个指针,由值给出的聚合将不会产生指针。
显然,其默认的定义可通过generationsettings来改变。
转到Java标签:
再转到Php标签:
再转到IDL标签:
回到UML标签,首先改变关系的类型为具有双向的关联,然后做其它的修改,使之如是:
转到C++标签,然后按Defaultdeclaration按钮,则有两极(两端):
转到Java标签,然后按Defaultdeclaration按钮,则有两极(两端):
转到IDL标签,然后按Defaultdeclaration按钮,则有两极(两端):
正如你所见到的,默认的定义依赖于关联的类型和关联的重数,当然这些默认值可通过generationsettings进行修改。
UML的范型相对于各语言来说都是屏蔽的(保护的),其实现可以通过generationsettings进行修改。
下面你可见到,UML中vector在C++中产生一个向量Vector,而在IDL中产生序列sequence。
按OK按钮,看图:
因为,现在关联是双向的,在浏览器中C1andAdministrator中都可见到此关联。
(我将它们标记为红色)
定义结构、联合、类型定义(typedef),枚举
要定义一个C++或ISDL的struc,使用类范型struct,使用Defaultdeclaration按钮,针对相关的语言编辑类。
在Java中的struct是通过一个标准的类来实现的,当然在UML的类范型到给定的语言的映射可以通过设置generationsettings来完成,请看下面的对话框,并参阅参考手册。
要定义一个C++或IDL的联合,针对Class使用Union范型:
例如要在C++中定义typedefT,它是指向C1的一个指针:
创建类T,绘制一个从T到C1的依赖关系。
编辑此类T,设置其范型为typedef:
对话框中发生改变指向其基类型。
转到C++标签:
当然,依赖性不是强制的,例如可以定义typedefintturlututu
在$(type)和$(name)之间増加一个’*’:
通过enum范型和enum_pattern范型以支持枚举。
创建一个类E,编辑E,设置其范型为enum,按OK。
在浏览器中调用类的关联菜单,选择additem并给一个名字a,接着,重新调用类的关联菜单,选择addattribute,并给一个名字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:
doesnothaveassociatedartifact.”在UML2中artifacts表示生成的文件,源文件,代码,库,执行文件,jar等,。
。
。
。
[以下内容在最新版BOUML已经不存在,略过]