利用UML编写Java应用措施
副标题#e#
引言
统一建模语言(Unified Modeling Language,简写为UML)是一种通用的模仿语言,它可以用于确定、展示和记录软件系统的设计进程。统一建模语言中的图形标志,尤其是用于面向工具的软件设计。它有两大利益:
(1)UML是国际软件家产界遍及承认的尺度,它统一了工具模仿的标志和寄义,使软件设计东西能发挥更大的坚守,同时,现有的工具设计也能更容易地被从头利用。
(2)UML博采众长,设内地均衡了简捷性和详细化两个总之,UML已经成为一种单独的系统来演化,不像以前的多种尺度的体系引起的问题。
所以,作为软件开拓者,完全有须要进修、相识UML。本文就提供了一个案例研究,我只是想操作这个案例研究给各人一个对UML的感性认识,相识在现实世界中如何利用 UML来编写应用措施。所以我想找了一个相比拟力巨大的案例,找来找去,发明图书馆中处理惩罚借出以及预借书籍和杂志的应用措施是相当大的例子,足以说明UML如安在现实世界中利用。
我只是操作利用案例(use case)和接头域阐明来阐明描写一个阐明模子中的应用,我把它扩展成一个设计模子,用来描写技能办理方案的一个代表部门, 最后,我们再用Java语言举办编码。但请记着,我给出的只是一种大概的办理方案,尚有很多其他的办理方案需要您用智慧的脑子去掘客,并且这世界上也没有适合所有的环境的办理方案。虽然,某些办理方案会比其他的要好,但那只有有了足够的履历和碰着的很多坚苦的事并办理之后才会积聚下来常识。好,下面我们进入案例研究。
要求
一般环境下,是利用系统的最终用户的代表人来书写要求类型,对付图书馆应用措施,要求类型应该如下:
1、图书馆应用措施该当是图书馆的支持系统。
2、图书馆把书籍和杂志借给借书者(读者)的条件虽然是读者该当在该系统中注册过,同样书籍和杂志也该当在系统中注册过。
3、图书馆处理惩罚购置新书或杂志的操纵,脱销书或杂志该当多购几本,旧的书籍和杂志当它们过期或残缺时就应适当把它们从书架上请下来。
4、图书打点员是图书馆中的职员,他的职责就是与顾主 (借书者)打交道并通过该系统完成事情。
5、借书者可以预借一本当前不在图书馆中的书籍或杂志,当这本书被偿还或被购入图书馆的时候,他就会接到通知;当借书者借到这本书或杂志的时候,预定就会被打消;也可以利用显示措施打消预借。
6、图书馆可以很容易地建设,更新和删除系统中的书名,借书者,借阅环境以及预借环境等信息
7、该系统可以运行于所有风行的操纵系统,包罗 UNIX, Windows以及 OS/2,它还该当有先进的友好的图形用户界面 ( GUI )。
8、该系统该当很容易利用新的成果扩展。
在本案例阐明中,该系统的第一个版本不需要处理惩罚某个读者预借的书籍成为可借书籍时发送动静给读者的操纵,也不需要查抄某本书籍是否已经超时了。
#p#副标题#e#
阐明
阐明的目标是为了得到和描写系统中所有的要求,以及生成一个在该系统中界说要害域类的模子。其方针是在开拓者与拟定要求的人之间成立彼此领略和相同,因此阐明是一种典范的与用户或客户相助的行为。在这个阶段开拓者不该该思量详细的代码或措施细节; 这只是真正地领略要求和正在设计的系统的实际环境的第一步。
第一节 阐明要求
阐明的第一步该当是判定该系统将被用于做什么以及谁将利用它。这别离是所谓的利用案例(use case)和动作者(actor)。利用案例描写了图书馆系统详细该当提供哪些成果,即系统的成果要求。一个利用案例阐明进程包罗阅读和阐明类型,而且接头该系统的潜在的用户 (客户)。图书馆中的动作者是图书打点员和借书者,图书打点员是该系统的用户而借书者则是顾主,查察而且预订书籍和杂志的人应该是借书者,可是有时候也大概是一个图书打点员或别的一个图书馆。借书者并不需要直接与系统打交道,借书者的成果通过图书打点员来署理完成。
图书馆系统的利用案例是:
借书
还书
生成预订
删除预订
增加书目
更新或删除书目
添加书籍
删除书籍
添加借书者
更新或删除借书者
因为图书馆中的一种脱销书经常有好几本,所以系统必需把脱销书从普黄历目中区别开来。
假如借书者没有预借书籍:
识别像要借的书的书名。
识别馆中本书今朝可借的书籍
识别借书者
图书馆借出这本书。
挂号方才产生的借出环境。
假如借书者曾预借某本书籍:
识别借书者。
识别预借的书名。
识别馆中本书今朝可借的书籍。
图书馆借给借书人相应的书。
挂号借出环境 。
删除预借书籍的记载。
#p#分页标题#e#
除用于界说本系统的成果要求之外,利用案例还被用来阐明查抄适当的接头域类是否已经被界说,以及在设计进程中它们是否能被用来确认该技能办理方案可以或许处理惩罚所需要成果。利用案例可以在序列图上瞥见,来实现一些技能细节。
第二节 接头域阐明
阐明进程中还要具体地罗列接头域 (domain ,系统中要害的类 ),为了举办接头域阐明,需要充实领略类型和利用案例而且着眼于系统将要处理惩罚的 "观念 "; 可能与利用者及接头域专家组织一次集团研讨交涉,实验找出所有必需处理惩罚的要害观念以及它们之间的彼此干系。
图书馆系统中的接头域类如下:: BorrowerInformation(这样定名是为了区别于利用案例图表中的动作者 Borrower), Title, Book Title, Magazine, Item, Reservation和 Loan。 图 2是一张类图,标出它们的彼此干系。这些接头域类是用户自界说的类,指定该类的工具是要害域的一部门并将被耐久的生存在系统中。
图二表明:域类布局。 域阐明要具体罗列系统中的要害的类。 对付每一个工具,它挪用别的一个工具上的要领,就要在类之间加上一根线来说明它们的干系。每个用来暗示类的矩形框被横向隔成三部门。 最上面一格是类的名称,中间是类的属性,最下面一格是类的要领。 两个类之间的关联用一根实现毗连代表,象征一个工具挪用了别的一个工具的要领。假如你仔细调查,还会发此刻Loan和Item关联的Loan端的"0..1",代表那一端可取的工具数。
一些类用UML状态图来显示这些类的工具的差异状态以及可以或许使它们的状态改变的事件,如本文中的例子就是Item和 Title。图 3就是借书(Lend Item)的利用案例的序列图 (借书者没有预借书籍 )。
图三表明:借书情景的序列图。本情景给出的是利用案例的特定的进程,情景老是以一个动作者为初步,即系统以外的人。然跋文录通过系统直到以所有的动作者角度来看这个的动作都已完成的完整的蹊径。用于标注一个情景的UML暗号法就是序列图。这张序列图用来说明一个情景,即借书者没有预借某本书时的借书情景。
当我们给序列图建模的时候,很明明,我们需要给动作者提供一个与窗口或对话框的接口界面。在本案例阐明中,为了把窗口类从接头域类中区分隔的,就把窗口类放入一个名为 " GUI Package "的包中,而把接头域类放入一个名为" Business Package "的包,该当明晰需要提供借书、预借书籍和还书界面窗口,此时还不需要界说详细的用户界面。
设计
当已经思量了所有的技能细节和限制条件,我们就可以进入设计阶段,设计阶段需要展开和细化阐明模子。设计的目标是为了说明一种可以很容易地翻译成措施设计代码的事情办理方案。
设计阶段可以分成两部门:
1、布局设计 这长短常高级的设计,说明在什么处所界说包(子系统),以及包与包之间的彼此依赖与通信机制。自然,我们的方针是构建一种清晰而又简朴的体系布局,包与包之间的依赖要少,假如大概的话,只管制止双向的依赖。
2、具体设计 所有的类都应描写足够的细节,来明晰划定谁来编码这些类。 UML中的动态模子用于示范类的工具在详细的情况中的行为。
下面我将具体说明。
第一节 布局设计
一个设计精采的体系布局是开拓一个可扩展、可改变的系统的基本,措施包所需要体贴的是要么处理惩罚一个详细的成果区域,要么处理惩罚一个详细的技能区域。从技能逻辑中把应用措施逻辑(域类)区分隔来是极其重要的,这是为了万一需要修改措施的某一部门而不会对另一部门发生影响:一个方针就是标识并设定包与包之间(譬喻“子系统”)的彼此依赖的法则,并不在包之间建设双向的依赖(为了制止措施包集成的过分细密),另一个方针是为了暗示尺度类库的需要。此刻可用的应用措施库强调的主要照旧在技能规模,好比用户界面,数据库或通信机制等等,可是,我们也同样渴望呈现更多的详细的应用措施库。
本案例研究中的措施包可能说是子系统如下:
#p#分页标题#e#
1、用户界面包(User-Interface) 这些类都是基于 Java AWT包这个Java顶用于编写用户界面应用措施的一个尺度的类库。这个措施包与贸易工具包(Business Object)协作,贸易工具包包括了实际上用于储存数据用的类,用户界面包挪用贸易工具中的要领来取得并向贸易工具中插入数据。
2、贸易工具包(Business Object) 它包罗来自阐明模子,好比 BorrowerInformation, Title, Item, Loan等等的接头域类。 该设计完全地界说了它们的操纵而且添加了对付耐久性的支持。 贸易工具包与数据库包相助,所有的贸易工具类都必需从数据库包中的 Persistent类担任而来。
3、数据库包 (Database Package) 数据库包给贸易工具包中的别的一个类提供处事,以使它们可以或许耐久的储存信息。在今朝的版本,Persistent类将储存它的子类工具到文件系统中的文件中去。
4、实用措施包(Utility Package) 实用措施包包括用于该系统中的别的一个包的处事,此刻,该包中只有 ObjId类,它用于引用广泛本系统的耐久工具,包罗用户界面,贸易工具和数据库包。
这些措施包的内部设计见图 4。
图4表明 图书馆应用措施布局概图。 这是一张类图,说明应用措施包以及它们之间的干系。数据库包提供了耐久性,公用措施包提供了Object ID类,贸易工具包包括了接头域类,这点在图5中将具体列出。最后,基于尺度Java AWT类库的UI包挪用贸易工具中的操纵来向它们中间插入数据。
第二节 具体设计
具体设计描写新的类–在用户界面和数据库包中的类,以及在天职析中描画的贸易工具类以外的人。本类的状态和动态图表利用的是与阐明进程中一样的图表,可是它们被界说在越发具体和更高的技能条理,阐明进程中的利用案例描写用于验证在设计阶段处理惩罚的利用案例,利用序列图表阐发在系统中,每个利用案例是如安在技能上实现的。
数据库包 应用措施必需有耐久储存工具,所以必需添加一个数据库层来提供这个处事,为了简朴起见,我们把工具作为文件储存在磁盘上,关于存储器的细节就不需要被应用措施所知了,它挪用通用操纵,好比 store()、update()、delete()和 find()等等,这些都是一个挪用 Persistent的类的一部门,所有的类都需要担任 Persistent(耐久工具)。
耐久性处理惩罚中的一个重要的因素就是 ObjId类,它的工具用于引用任何系统中的耐久工具 (无论工具是在磁盘上照旧已经被读入应用措施中了 )。 ObjId是Object Identity的简写,是一种熟知的技能,用于处理惩罚应用措施中的工具引用。 通过利用工具标识,一个工具标识号就能被通报到 Persistent.getObject ( )操纵,然后该工具将从耐久存储器中取回。 凡是,这要通过每个耐久类中的 getObject操纵来完成,它还要执行须要的范例查抄和转换。工具标识号还可以很容易地作为操纵的参数被通报 (譬喻,一个寻找详细工具的搜索窗口可以通过工具标识号通报它的功效到别的一个窗口 )。
ObjId标识系统(用户界面、贸易工具和数据库)中所有的包利用的一个通例类,因此它在设计阶段就被放进实用措施包中而不是数据库包中。Persistent类的当前实现还可以不足完善,它的最终方针是可以很容易的改变耐久存储器的实现,今朝的替代的步伐是把工具出存在干系数据库或面向工具数据库中,也可以利用Java中的耐久工具支持储存它们。
贸易工具包 在设计阶段中的贸易工具包基于阐明进程中相应的包——接头域类。类以及它们的彼此干系和行为没有变,可是类被描写的越发具体,包罗了它们的彼此干系和行为如何实现。
一些操纵已经被翻译成好几个设计模子中的操纵,一些还被改了名称,这都是很正常的,因为阐明只是每个类的本领的描画,而设计则是系统具体的描写,因此设计模子中的所有的操纵都必需有界说好的特征和返回值,留意,下面给出了设计与阐明的差异。
图5表明 贸易工具设计。 这张图表充分了贸易工具措施包的各类差异的类的设计。接口越发准确,选择了属性的数据范例。
系统的当前版本不必查抄一本书是否实时偿还,也不必处理惩罚预借书籍的订单,因此Loan和 Reservation类的日期属性就没有实现。
杂志和书的处理惩罚进程是完全沟通的,除了借期的差异,并且它还不消处理惩罚。 在阐明中, Magazine和 Book Title子类已经被认为不须要的而且在 Title类中只有一个范例属性指定该书名是否指出一本书或杂志。在今后的应用措施版本中,假如认为有须要的话,这两个简化都可以删除。
#p#分页标题#e#
阐明进程中的状态图表在设计阶段又被细化了,显示在事情系统中状态如何被暗示以及被处理惩罚。 Title类的设计状态图表如图 6。 其他工具可以通过挪用 addReservation ( )和 removeReservation ( )操纵来改变 Title的状态,就像这张图表中所显示的那样。
图6表明 设计Title的状态图
用户界面包 用户界面包老是在其他包之前,在系统中,它给用户提供处事和信息,显然,这个包基于尺度的 Java AWT ( Abstract Window Toolkit )类。设计模子中的动态模子已经被分派到 GUI包中,因为所有的与用户的交互浸染都是通过用户界面开始的, 另外,我们还选择序列图表来说明动态模子,本利用案例的设计模子的实现都是用细节描写的,包罗类中的实际的操纵。序列图表实际上是以一系列迭代的形式建设的。在实现(即编码)阶段更多的细节上的掘客会发生更进一步的迭代。 图 7表白 Add Title的功效设计序列图表。
图7表明 Add Title的序列图
我们还可以利用协作图表取代序列图表,象图 8。
图8表明 Add Title的协作图。
第三节 用户界面设计
在设计阶段,我们利用一个特定勾当建设用户界面。
图书馆应用措施中的用户界面是基于本利用案例的,而且已经被分成下列部门,在主窗口上,它的每个部门都已经被给以一个单独的菜单栏:
1、成果 本系统中的主要成果的窗口就是用来借书、还书以及与借书籍的挂号事情等。
2、信息 本系统中的查察信息的窗口就是用来收集书名和借书者的信息。
3、维护 维护本系统的窗口用来添加、更新和删除书名、借书者以及书籍。
图9 是一个用户界面包中的类图的例子。
图9表明 成果类图模子。
一般环境下,每个窗口提供一个系统中的处事而且映射到一个利用案例 (纵然并不是所有的用户界面都必需从一个利用案例中映射而来), 建设一个乐成的用户界面超出本文接头的范畴,读者伴侣请参阅文后提供的代码。我今后还会专门辑文探讨这个问题。
实现
措施设计在结构或实现阶段就开始了,应用措施的要求划定本系统可以或许运行于各类差异的处理惩罚器和操纵系统,因此Java语言是实现本系统的最好的选择。Java可以很容易的映射逻辑类到代码组件,因为一个类有到Java代码文件的一对一的映射。图 10说明白在本例中的设计模子的组件图表包括一个逻辑视图中的类到组件视图的组件的简朴映射。每个组件包括一个逻辑视图中的类的描写的链接,这样就使在差异的视图之间定位变得很容易 (纵然,象在本例中,它只是简朴的利用了文件名 )。组件之间的依赖在组件图表中并没有暗示出来(除了贸易工具包 ),因为可以从逻辑视图中的类图衍生出它们之间的依赖。
图10
为了编码,要从设计模子中的下列图表中取得类型:
类类型: 每个类的类型,用于具体地说明须要的属性和操纵。
类图: 它所要先容的类的类图,说明白它的静态布局和与其他类的彼此干系。
状态图: 类的状态图,说明白大概的状态以及需要被处理惩罚的过渡期 (以及触发该过渡期的操纵 )。
类的工具中包括的动态图 (序列图、协作图以及勾当图):说明类的一个详细的要领的实现的图表可能是说明其他工具是如何利用类的工具的图表。
利用案例图表以及类型: 等开拓者需要知道关于系统利用环境时说明系统被利用的功效(当开拓者以为被整个系统的细节问题所搞糊涂的时候)。
显然,设计阶段的不敷将在编码阶段袒暴露来,我们需要找出哪些操纵需要更新、哪些操纵需要修改,这就意味着开拓者将不得不改变设计模子。 在所有个项目开拓中城市碰着这种工作, 重要的是,我们要使设计模子和代码同步,这样设计模子就能被称为系统最后的所需要的设计。
思量下面这些要点:
Java措施包类型是划定这个类所属的组件或逻辑视图的等价代码。
私有属性切合模子中划定属性的。 而且, Java要领切合模子中的操纵。
ObjId类 (工具标识符)被挪用来实现关联,这意味着关联凡是被和该类一起生存 (因为 ObjId类是耐久的类)。