图书馆管理面向对象分析与设计_第1页
图书馆管理面向对象分析与设计_第2页
图书馆管理面向对象分析与设计_第3页
图书馆管理面向对象分析与设计_第4页
图书馆管理面向对象分析与设计_第5页
已阅读5页,还剩160页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件工程

第五章面向对象分析与设计5.1需求获取5.2面向对象分析5.3面向对象设计5.4系统设计5.5对象设计1软件工程5.1

需求获取需求获取的目标是确定用户“需要”什么样的软件产品,就是说,新的软件必须能够做什么。没有专业的系统分析人员,用户很难了解到需要开发什么相关信息和功能;另一方面,没有与用户的交流,系统分析人员也很难弄清客户真正需要什么。发现用户需求的过程称为需求获取。一旦提出了最初的需求,进一步推敲、细化和扩充的过程称为分析。2软件工程需求获取的第一步是理解应用领域,即目标软件的应用环境。如银行、电信公司、书店等。一旦系统分析人员对该领域有了充分了解,就可以建立一个业务模型,描述用户的业务过程,确定用户的初始需求。然后通过迭代,更深入了解应用领域,回过头来推敲业务模型。这种迭代过程直到双方对需求的理解达到共识。需求获取的结果是导出用户可理解的系统规格说明。3软件工程开发用户需求的典型过程1.识别用户需求2.访谈用户代表

识别各种需要与要求使用工具帮助表达用户需求绘制GUI草图确定硬件环境3.用标准文档格式撰写客户需求4.核查用户需求请用户评审用户批准后5.构建详细需求(分析建模)4软件工程5.1.1

与用户交互1)需求的来源不同类型应用能从人员处获取需求的比例:相对低的相对高的从人群获取需求的大概百分比应用的类型高度受限的不受限制的导弹制导系统航班控制系统公司财务系统增强版制造控制系统公司财务系统Encounter视频游戏军事战略决策支持系统5软件工程所谓限制,是指受客观物理规律的限制。如导弹制导系统更多地受物理运动定律的限制,而非人的决策。视频游戏的大部分需求依赖人,因为它是一个相像出来的产品。应用受到的限制越少,能从人们那里获得的需求比例越大。2)识别利益相关者(stakeholder)对项目承担风险和享有利益的人即为利益相关者。他们是应用的“客户”。如公司高层、项目经理、最终用户、系统开发人员等。6软件工程不同利益相关者之间的利益冲突会导致需求不一致。如果需求冲突不能调和,项目就会陷入困境,最后往往会被取消。即使所有利益相关者的需求一致,也可能由于实现代价高昂,需求不能得到完全满足。3)了解客户的需求一般客户希望得到一个产品,他们需要系统开发人员帮助,明确自己的需要。例如,有一个客户愿望框架:“Encounter是一个角色扮演游戏,它能模拟被扮演人物的全部或部分活动,应对人们具有相当吸引力。”7软件工程完整的客户要求应当记录在需求文档的“概述”部分。但需求中还有一些问题需要由系统分析人员与客户商量,以明确这些需求。例如游戏是否只允许玩家扮演一个角色还是可以同时控制多个人物?当两个人相遇时会发生什么事情?游戏是否可以联网对战等。4)访谈和文档记录大部分需求获取是人与人沟通的活动,这些活动经过精心组织,以准确获得最好的效果。准备和访谈客户的过程如下:8软件工程访谈之前列出访谈的“客户”对象,并划分客户优先级最有可能决定项目成败的人安排访谈日程,设定开始和结束时间系统开发人员至少有两人参加访谈准备录音设备访谈中注意倾听不要处于被动状态:启发和鼓励理解客户的需要并探索要求采用用例?或数据流图?状态图?9软件工程记录全部访谈内容安排补充会议访谈之后根据标准模版撰写软件需求规格说明(SRS),打客户需求草稿通过电子邮件征求客户意见对于不同类型的应用,用例方法是一种获取和表达需求的有效方法。某些需求需要通过数据流图或状态图与用户沟通。10软件工程5.1.2描述客户需求需求可以看成是应用与应用的外部代理(如用户)之间的交互。可利用用例作为表达工具。用例描述了系统外的参与者(Actor)与应用之间的交互情况。主要注重用户对系统的看法。描述客户需求的过程如下:1)标识参与者标识目标系统将支持的不同类型的用户,可以是人、事件或其他系统。2)标识场景用场景描述目标系统典型功能的活动细节,并与用户沟通,加深开发人员对应用领域的理解。11软件工程3)标识用例当双方确定了一组场景后,开发人员从该场景抽象出一组用例,描述所有可能的情况。用力表达了系统的范围。4)求精用例细化每一个用例。引入带有出错处理或带有异常处理的用例,描述系统的行为,保证需求的描述是完全的。5)标识用例之间的关系描述用例之间的依赖关系,提取相同功能,建立用例模型。6)标识非功能需求包括系统性能上的约束、文档、使用资源、安全性和质量等需求。12软件工程需求获取期间,开发人员需要访问一些不同的信息资源:客户提供的与应用领域相关的文档和手册。将被目标系统替代的遗留系统的技术文档。最终用户和客户本人。以“图书管理系统”为例,首先标识参与者:Librarian图书管理员:创建、修改、删除借阅者信息;添加、编辑、删除馆藏图书信息;添加、编辑、删除流通图书信息。Borrower借阅者:借阅、预约、归还流通图书,以及取消图书预约。13软件工程流通图书(Book)是指某种馆藏图书(Title)的某一流通中的复本。例如“数学分析教程第二册”的5本馆藏复本中的第3本。识别用例:BorrowBook:借阅流通图书ReturnBook:返还流通图书RecerveTitle:预约某种馆藏图书CancelReservation:取消预约MaintainBorrowerInfo:维护借阅者信息,包括创建、修改、取消借阅者账户MaintainTitleInfo:维护馆藏图书信息,包14软件工程

括添加、修改、删除馆藏图书信息MaintainBookInfo:维护流通图书信息,包括添加、修改、删除流通图书信息Login:登录识别参与者与用例之间的关系(场景)Borrower执行BorrowBook、ReturnBook、ReserveTitle、CancelReservation等用例。Borrower是通过Librarian完成上述用例的工作。则Borrower与Librarian存在依赖关系。Librarian还与MaintainBorrowerInfo、Main-tainTitleInfo、

MaintainBookInfo交互。15软件工程Librarian还需要与用例Login交互。画出用例图BorrowerLibrarianBorrowBookReturnBookReserveTitleCancelReservation<<uses>>16软件工程用例BorrowBook的规格说明1.1前置条件:在此用例开始之前,Librarian必须登录到系统中。LibrarianLoginMaintainTitleInfoMaintainBookInfoMaintainBorrowerInfo17软件工程18软件工程19软件工程1.2后置条件:如果此用例执行成功,在系统中建立并存储一条借阅记录,必须时需要删除预约记录。如果执行不成功,系统状态不变。1.3事件流基本流当Borrower借阅馆藏图书,且Librarian选择“借书”,则此用例启动。提供馆藏图书和借阅者信息。检索馆藏图书(E-1)。确定该馆藏图书的物理复本(流通图书)是否在架(E-2)。20软件工程检索借阅者(E-3)。将流通图书交给借阅者。创建并存储借阅记录。删除预约记录。候补流E-1:若该种图书不存在,系统显示提示信息,用例终止。E-2:若该种图书都已解出,系统显示提示信息,用例终止。E-3:系统中不存在该借阅者,系统显示提示信息,用例终止。21软件工程5.1.3与用户沟通的其他工具1)数据流图某些需求可以很自然地表述为处理元素之间的数据流。顶层图即为系统与外部实体的交互。2)状态图有时把应用看作是几个状态下的应用,而在某一确定时刻的应用始终明确地处于某个状态中。这种状态划分对理解系统比较有益。状态的具体内容到实现阶段会有确切的定义。22软件工程借书过程的数据流图外部实体、数据流和数据存储都为候选对象管理员

1借书检验2借书登记索书单借书证检验错误借书信息日历

借阅记录

借阅者信息

图书信息

借书证图书23软件工程还书过程的数据流图系统与外部实体、系统与数据存储的交互,构成系统的接口。相应数据流构成接口数据。借阅者

3还书检验4还书登记检验错误还书信息日历

借阅记录

图书24软件工程馆藏图书(对象)的状态图借出在架丢失修补报废出借返还丢失丢失注销损坏上架25软件工程图书管理员借书操作的状态图登记读者信息登记借书信息findTitle(检索图书)login(登录)findBorrower(查找借阅者)reserve(预约)借书预约图书手续完成检验图书borrow(借阅)检查图书状态取消findBook(检索复本)setLoan(设借阅状态)cancel(取消)close(关闭)检验读者借书26软件工程借阅者图书馆在书架上找书[返还][借阅]排队等待创建借阅记录准备下次行动[返还][借阅]书放回书架删除借书记录[多个][不多于一个]27软件工程28软件工程29软件工程活动图(ActivityDiagram)一个活动是一个在状态机内部正在进行的非原子(即可中断的)动作。活动图是一种特殊的状态图。其中,大多数的或者全部的状态都是动作状态或者活动状态大多数的或者全部的迁移都是由于源状态中活动的完成而被触发的。一个活动图着重于描述计算过程或工作流的顺序的和并发的执行步骤。30软件工程活动图的两种使用方式对工作流建模对操作建模实现与系统进行协作的参与者所观察到的活动把活动图作为流程图使用,对一个计算的细节部分建模适用性对工作流的建模对分支、分叉和汇合状态的建模内容用于可视化、详述、构造和文档化开发系统所涉及的业务过程操作的参数和它的局部对象31软件工程泳道(swimlanes)活动图描述发生了什么,但没有说明该活动由谁来完成。泳道描述了这种关系。泳道用矩形框表示,属于某个泳道的活动放在该矩形框内,将对象名放在矩形框的顶部,表示泳道中的活动由该对象负责。两个泳道中活动的各自由不同的对象负责,活动之间控制权的转移表明对象之间的协作关系。所以泳道可以将活动图的逻辑描述与顺序图、写作图的责任描述结合起来。32软件工程5.1.4草拟用户界面和其他接口建立初始用户界面,是原型方法的一种,目的是快速与客户沟通。客户通常在看到应用的图形用户界面(GUI)才能相像到这个应用未来的样子。开发用户界面的步骤如下:1)了解客户深入了解最终用户的想法。根据用户的层次,提供多种用户界面。知识和经验层次:计算机素养、系统经验、使用类似应用的经验、教育水平、阅读水平、打字技能等。33软件工程用户的生理特征:年龄、性别、左右手习惯、生理障碍等。2)理解业务功能根据应用的整体意图来理解特定用户界面的目的。功能界面出现的顺序通常可以反映用户处理日常业务的方式。用户的任务和工作特征:应用的使用方式、使用频率、雇员的流动率、任务的重要性、任务的重复性、对培训的期望、工作类型等。用户的心理特征:工作态度、能动性、认知方式等。34软件工程3)理解优秀界面设计的原则目的是加强视觉效果。确保应用的各个界面之间风格的一致性:习惯、步骤、视觉和感觉、位置等。揣测用户通常开始操作的地点导航系统尽量简捷使用分组和分层来强调重要性级别4)选择合适的窗口类型五类窗口:属性窗口:展示实体的属性对话窗口:完成特定任务或命令的信息35软件工程消息窗口:提供信息面板窗口:展示一组控件弹出窗口:突出显示信息5)制作系统菜单为用户提供一个稳定的、易于理解的使用环境,可以方便地搜寻需要的选项。提供一个主菜单显示所有相关选择(仅局限于此)将菜单结构与应用要完成的任务对应起来尽量减少菜单的级数36软件工程6)选择合适的基于设备的控件提供给用户,向系统发送指示的实际手段,包括鼠标、键盘、触摸屏、绘图板、轨迹球、麦克风等。7)选择合适的基于界面的控件即出现在屏幕上的符号。用户通过这些符号向系统提出他的输入和操作意图,包括图标、按钮、复选框、单选框等。8)组织和安排窗口布局多窗口的排列规则,如平铺、层叠等。9)选择合适的颜色尽量保持简捷和低调。颜色需要和谐。37软件工程5.2面向对象分析分析建模的目的是对来自客户的需求形式化。形式化可以导致新的洞察和发现需求错误。1999年NASA损失了一颗价值数亿美元的气象卫星,据调查是因为列在度量表中的控制数据出了问题。不巧的是这个缺陷在灾难发生几天之前才刚发现,如果在需求分析阶段就被识别出来就可避免损失了。避免需求错误或遗漏的第一道防线就是把所有的需求细化,建立分析模型。38软件工程分析模型由三个独立的模型构成:由用例和场景表示的功能模型;用类和对象表示的分析对象模型;由状态图和顺序图表示的动态模型。在需求获取阶段得到的用例模型就是功能模型。据此可导出分析对象模型和动态模型。需要注意,这些模型代表的是来自客户的概念,而非实际软件类或实际构件。如数据库、子系统、会话管理器、网络等,不应出现在分析模型中,因为这些概念仅与实现相关。分析中的类可以看作是高层抽象,在后续阶段将使用更多的细节实现。39软件工程在分析对象模型中有实体对象、边界对象和控制对象等三种类型。实体对象表示系统将跟踪的持久信息;边界对象表示参与者与系统之间的交互(接口);控制对象负责用例的实现

。可用UML提供的衍型机制,区分不同类型对象。ControlEntityActorBoundary参与者边界对象控制对象实体对象图示40软件工程具有两个按钮的手表的分析类使用实体对象、边界对象和控制对象等概念对系统建模时,常常需要提供一些简单的启发式规则来指导开发人员使用这些概念,可以使用相应的类来跟踪。<<entity>>Day<<entity>>Month<<entity>>Year<<control>>ChangeDateControl<<boundary>>ButtonBoundary<<boundary>>LCDDisplayBoundary41软件工程分析建模活动包括以下步骤。标识实体对象自然语言分析法利用Abbott启发式准则,将语言成分映射为模型成分。语言成分模型成分示例专有名词实例人员乙普通名词类现场工作人员Doing动词操作创建、提交、选择Being动词继承是…的一种,是…中的一个Having动词聚合有…,由…组成,包括…情态动词约束必须是形容词属性事件描述42软件工程自然语言分析法主要关注用户术语。限制有识别质量高度依赖人们的书写风格;可能会出现许多无关词汇,或同义词。检查每一个用例,标识候选对象用例中的连续名词(如借阅事件);系统需要跟踪的现实世界中的实体(如借阅记录、馆藏图书信息);系统需要跟踪的现实世界中的活动(如紧急情况操作预案);数据源或数据潭(如借阅者、管理员)。43软件工程2) 标识边界对象在用例图中,每一个参与者至少要与一个边界对象交互。边界对象收集来自参与者的信息,将它们转换为可用于实体对象和控制对象的表示形式。边界对象对用户界面进行粗略的建模,不涉及如菜单项、滚动条等可视方面的细节。标识边界对象的启发式准则如下:标识用户所需初始用例的用户界面控制;标识用户需要键入系统的数据表格;标识通知和系统用于响应用户的消息;44软件工程当用例中有多个参与者时,根据构想的用户界面来标识参与者的行为;不要使用边界对象对接口的可视方面建模,应使用用户原型对可视用户界面建模;使用用户的术语来描述接口,不要使用来自设计和实现的术语。3) 标识控制对象控制对象负责协调实体对象和边界对象。控制对象没有在现实世界中具体的对应物,它通常从边界对象处收集信息,并把这些信息分配给实体对象。45软件工程图书管理系统中的对象Borrower:借阅者。他们可以借阅、返还、预约和取消预约。因为名字可能重复,可用借阅证号码识别。Title:馆藏图书。它表明某一种书,通过馆藏号码识别。Book:流通图书。它表明某一种书的具体复本,通过馆藏号码识别。Loan:借阅记录。同一个人关于不同图书的借阅记录是不同的。Reservation:预约记录。46软件工程图书管理系统中的边界对象mainWindow:主窗口。有借书、还书、预约、取消预约、添加书种、修改书种、删除书种、添加借阅者、修改借阅者、删除借阅者、添加图书复本、删除图书复本等操作。BorrowerDialog:借阅者对话框。有添加借阅者、修改借阅者、删除借阅者等操作。FindBwrDialog:弹出对话框。有根据借阅者ID号码查找借阅者的操作。TitleDialog:馆藏图书对话框。有添加书种、修改书种、删除书种等操作。47软件工程FindTDialog:弹出对话框。根据图书的馆藏号查找馆藏图书。BorrowDialog:借书对话框。根据馆藏图书的馆藏号和借阅者信息,执行借阅动作,创建和保存借阅记录。ReturnDialog:还书对话框.根据流通图书的馆藏号和复本号,执行还书动作,删除借阅记录。ReserveDialog:预约对话框。根据馆藏图书的馆藏号和借阅者信息,执行预约、取消预约动作。MessageWindow:显示提示信息窗口。LoginDialog:输入用户名和密码的窗口。48软件工程4) 使用顺序图将用例映射为对象顺序图将用例与对象联系起来,直观地描述了用例(场景)行为在其参与对象之间是如何实施的。顺序图对用例中各参与对象之间的交互序列进行建模。每一个消息从一个对象(或参与者)发送给另一个对象(或参与者)。消息的接受就触发了一个操作。通过顺序图,将责任以操作集合的形式分配给每一个对象。如果一个对象参与到多个用例,则其操作应为这些用例共享。49软件工程画顺序图的启发式准则如下:顺序图第一栏对应激活该用例的参与者;顺序图第二栏是边界对象;顺序图第三栏是管理用例中其他参与对象的控制对象;通过边界对象来初始化用例,并创建控制对象;通过控制对象可创建其他边界对象;实体对象允许边界对象和控制对象访问;试题对象不能访问边界对象和控制对象;50软件工程借书用例的顺序图:mainWindow:BorrowDialog:Title:Book:Borrower:Loan:Librarian1:borrow()2:createDialog()3:borrow()4:findTitle(string)5:getTitle()6:getAvaliableBook()7:findBorrower(string)8:newLoan(OID,OID,Date)9:store()10:getBorrower(OID)11:update()12:addLoan(OID)13:getObject(OID)14:setLoan(OID)15:update()51软件工程还书用例的顺序图:mainWindow:ReturnDialog:Book:Borrower:Loan:Librarian1:return()2:createDialog()3:return()4:findBook(Integer)5:getObject(OID)6:getLoan()7:getBorrower()8:setLoan(null)9:update()10:delLoan(OID)11:update()12:delete()52软件工程5)使用CRC卡片对对象之间的交互建模CRC是类、职责和协作的缩写。每一个类可用一张CRC卡片表示。建立CRC卡片有以下几个步骤:识别类和职责:

首先识别类或对象,然后从客户需求说明中寻找有关行为的描述,以发现职责。将职责分配到类:记录在相应的卡片上。

找寻协作者:依次检查每一类承担的责任,看是否需要其他类的帮助,找寻与每个类协作的伙伴,并记录在相应卡片上。53软件工程54软件工程55软件工程

职责显示欢迎词密码验证器接收磁卡菜单选择器让密码验证器检验启动菜单选择器退出磁卡

类名读卡机协作职责从账户中取出密码账户如无此账户返回假值提示客户输入密码读入密码比较核实,返回结果

类名密码验证器协作职责检查账户有效性返回密码检查取款/存款信息类名账户职责显示菜单存款管理器等待客户选择取款管理器调用相应的存款/取款管理器类名菜单选择器协作职责询问取款额账户要求验证账户出银机启动出银机发款类名取款管理器协作56软件工程细化:模拟在执行每个基本功能时系统内部出现的场景,以此推动细化工作的进行。在模拟一个场景的过程中,每当一个类开始“执行”时,它的卡片就被拿出来讨论,当“控制”传送到另一个类时,注意力就从前一张卡片转移到另一张上去了。不同的场景,包括例外和出错状况,都应逐一加以模拟。在这个过程中可以验证已有的定义,不断发现新的类、职责以及伙伴。在模拟不同的场景中会发现某些职责需要重新加以分配。这些都导致进一步的开发工作。57软件工程6) 标识关系(结构)使用类图,能够表示对象之间的关系。关联表示了两个或多个类之间的关系。标识关联的启发式准则如下:检查指示状态的动词或动词短语;准确地命名关联和角色;尽量使用常用的修饰词标识出名字空间和关键属性;消除可导出其他关联的关联;在关联集合稳定之前不必关心重复性;过多的关联使得一个模型不可读;58软件工程建立系统的包图(主题)建立包图是为了降低复杂性,目的是控制可见度及指引读者的思路。对于面向对象分析模型,主题表示此模型的整体框架。可以是一个层次结构。通过对主题的识别,可以让人们能够比较清晰地了解大而复杂的模型。LibraryGUIDataBase59软件工程

GUI:图形用户界面(GraphicalUserInterface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。60软件工程UML事物

分组事物package(包)包是把元素组织成组的机制,结构事物、行为事物甚至其他分组事物都可以放进包内。包不象构件(仅在运行时存在),它纯粹是概念上的(即它仅在开发时存在)。用户接口包业务对象包应用包61软件工程建立边界类的类图标明类之间的关系,包括关联、泛化等。messageWindowloginDialogreturnDialogborrowerDialogreserveDialogmainWindowfindTDialogborrowDialogfindBwrDialogTitleDialog62软件工程建立实体类的类图这些类与数据库相关,为了操作方便,以它们为子类,建立一个持久类(Persistent)作为它们的父类,共享与数据库相关的操作。BookBorrowerReservationTitleLoanPersistent(fromDataBase)110..1*0..*0..*0..*0..*1163软件工程建立边界类与实体类之间关系的类图Book(fromLibrary)110..1*0..*1Title(fromLibrary)Loan(fromLibrary)Borrower(fromLibrary)Reservation(fromLibrary)BorrowDialog(fromGUI)ReturnDialog(fromGUI)64软件工程Book(fromLibrary)110..1*0..*1Title(fromLibrary)Loan(fromLibrary)Borrower(fromLibrary)Reservation(fromLibrary)TitleDialog(fromGUI)findTDialog(fromGUI)0..*0..*10..*65软件工程标识属性对象所保存的信息称为它的属性。类的属性所描述的是状态信息,每个实例的属性值表达了该实例的状态值。标识属性的启发性准则如下:每个对象至少需包含一个属性;属性取值必需适合对象类的所有实例;出现在泛化关系中的对象所继承的属性必须与泛化关系一致;系统的所有存储数据必须定义为属性;66软件工程对象的导出属性应当略去。例如,“年龄”是由属性“出生年月”导出,它不能作为基本属性存在。8)对每一对象的与状态有关的行为建模对象收到消息后所能执行的操作称为它可提供的服务。对每个类的增加、修改、删除、选择等服务有时是隐含的,在图中不标出,但实现类和对象时有定义。其它服务则必须显式地在图中画出。首先标识在每个类中封装的服务;67软件工程再比较服务与类的属性,验证其一致性。所标识的类属性,它必然关联到某个服务,否则该属性就形同虚设,永远不可能被访问;画出对象之间的消息通信路径,协调系统的行为。自底向上方法:找出每一对象在其生存周期中的所有状态。每一状态的改变都关联到对象之间消息的传递。从对象着手,逐渐向上分析。自顶向下方法:一个对象必须识别系统中发生或出现的事件,产生发送给其他对象68软件工程

的消息,由那些对象作出响应。所以对象应具有能够接收、处理、产生每个消息的服务。它是从系统行为着手,然后逐渐分析到对象。使用顺序图或协作图,标识和描述对象之间的相互通信,并进行运行走查。10)分析模型评审有关模型正确性的问题:对实体对象的分类,用户是否能够理解?抽象类是否对应到用户层的定义?是否所有的描述均符合用户的定义?69软件工程是否所有的实体对象和边界对象都使用了有实际含义的名词短语进行了命名?是否所有的用例和控制对象都使用了有意义的动词短语进行了命名?是否所有的错误用例都已经描述和处理?有关模型完备性的问题:每一个对象是否有用例用到它?创建、修改或删除该对象的用例是哪些?每一个属性的类型是什么?它应进行修饰吗?每一个关联何时被用到?其重复性的选择原则是什么?该关联使用那一种连接?70软件工程每一个控制对象是否具有必要的关联,以连接到用例中相关的其他对象?有关模型一致性的问题:是否有多个类或多个用例同名?名字相近的实体(如类、对象、属性)能够相互区别吗?在同一泛化层次是否存在相似属性和关联的对象?有关模型可实现性的问题:在该系统中性能需求和可靠性需求是否满足?在选定硬件上运行原型是否可以确定需求?71软件工程5.3面向对象的设计面向对象设计分两个阶段进行:系统设计和对象设计。系统设计的主要活动是:标识系统目标:标识并区分各种质量属性的优先实现次序。子系统分解:根据用例和分析模型,将系统分解为一系列子系统。子系统细化:对各子系统不断分解求精,直到所有的设计目标都能满足为止。72软件工程对象设计主要是追加一些与实现有关的对象,以及对已有对象进行细化。设计原则1:分治软件系统分解为子系统分布式系统可以分解为客户机和服务器;系统可以分解为一系列子系统;子系统可以分解为一个或多个包;包可以分解为类;创建良好设计的原则73软件工程类可以分解为方法。设计原则2:尽可能增加内聚不同内聚类型:优先级从高到低排序1) 功能内聚:构件只执行单一计算并返回结果,没有副作用。如函数过程。2) 层内聚:相关服务放在一起,并有严格的层次结构,高层服务可访问低层服务,反之不可。如分层结构。3) 通信内聚:访问或操作同一数据的过程放在一个类中,这些过程可以互相通信。如某个74软件工程 类设计。顺序内聚:存在一系列过程,其中一个过程向另一个过程提供输入,这些过程放在一起,形成顺序内聚。如消息序列。5) 过程内聚:几个一次调用的过程放在一起,形成过程内聚。如调用结构。时间内聚:程序执行过程中同一阶段内完成的操作放在一起,达到时间内聚。实用程序内聚:逻辑上不能纳入其他内聚类型的相关实用程序放在一起,形成实用程序内聚。如可复用的过程或类。75软件工程设计原则3:尽可能降低耦合模块间存在相互依赖关系即为耦合。不同耦合类型从高向低排列有:内容耦合:一个构件修改另一个构件内部的数据,应始终避免。公共耦合:一组构件使用全局数据,就产生公共耦合。应通过封装降低公共耦合。控制耦合:一个过程通过标志、开关或命令显式地控制另一个过程的动作,就产生控制耦合。降低的方法是采用多态操作。76软件工程标记耦合:在一个操作的参数表中将类作为参数,就产生标记耦合。可以改用传递简单变量或使用接口做参数降低耦合。数据耦合:在一个操作的参数表中用简单变量或简单的类(如string)作为参数,就产生数据耦合。应通过减少参数个数降低耦合。例程调用耦合:一个例程(或类操作)调用另一个例程,就产生例程调用耦合。如果出现例程调用序列,降低的方法是编写一个例程将这个调用序列封装起来。77软件工程类型使用耦合:类将实例变量或本地变量声明为另一个类的实例,就产生类型(嵌套)使用耦合。可将变量的类型声明为包含所需操作的最通用的类或接口。包含/引入耦合:一个构件引入(import)一个包时就产生引入耦合,一个构件包含(include)另一个构件时,就产生包含耦合。外部耦合:模块对外部系统,如操作系统、共享库或硬件有依赖关系时就产生外部耦合。可通过信息隐蔽减少这种依赖关系。78软件工程设计原则4:尽可能提高抽象层次设计应隐藏或推迟考虑细节以降低复杂性。类是包含过程抽象的数据抽象。使用泛化关系(父类)和接口,可进一步提高抽象层次。类中公有操作越少,抽象程度越高。类中所有变量都是私有的,抽象程度达到最高。抽象可确保在设计时不必关心不必要的细节,能把握问题的本质并做出重要的决策。79软件工程设计原则5:尽可能提高可复用性可以在算法、类、过程、框架和完整应用程序的级别上创建可复用性。复用构件的机制包括过程调用和继承父类。设计原则6:尽可能复用已有的设计和代码复用已有的设计是对可复用性设计的补充。通过复用可从以往对可复用构件的投资中获益。设计原则7:灵活性设计积极预测将来可能在实现和功能上的变化,并80软件工程

采取相应措施。在设计中引入灵活性的方法有:降低耦合并提高内聚(易于提高替换能力)建立抽象(创建有多态操作的接口和父类)不要将代码写死(消除代码中的常数)抛出异常(由操作的调用者处理异常)使用并创建可复用的代码设计原则8:预计过期积极预测将来可能在技术和运行环境上的变化,并为此采取相应措施。81软件工程在设计中应遵循的预计过期的规则有:避免使用早期发布的技术避免使用针对特定环境的软件库避免使用软件库中未编档的或很少使用的功能避免使用小公司或可能不提供长期支持的公司提供的可复用构件或特殊硬件使用众多厂商支持的标准语言和技术设计原则9:可移植性设计可移植性设计的主要目标是让软件在尽可能多82软件工程

的平台上运行。实现可移植性的规则有:避免使用特定环境的专有功能使用不依赖特定平台的程序设计语言小心使用可能依赖某一平台的类库了解其他语言可能依赖特殊硬件结构的功能和文本文件的差异设计原则10:可测试性设计设计时采取措施使得测试易于进行。可测试性设计的最重要的方法是保证代码的所有功能都能脱离图形用户界面执行。83软件工程设计原则11:防御性设计为提高可靠性,应确保不引入任何缺陷,能够处理其他代码不适当使用构件引起的问题。按契约设计是防御性设计技术,其核心思想:被调用操作为正常执行必须满足的前置条件(precondition):调用操作在调用一个操作时有责任确保该操作的前置条件成立。被调用操作正常执行所得到的结果即为后置条件(postcongdition):要求被调用操作在返回前有责任保证这些后置条件成立。84软件工程被调用操作在执行时确保不会被修改的不变量(invariant)。前置条件、后置条件和不变式都是布尔表达式,其计算结果为假,表示有错误发生。可以使用断言机制。在重要构件的边界(如层)应始终保留严格的断言检测。85软件工程系统设计的主要活动是进行子系统分解,并在此基础上定义子系统/构件之间的接口。为此,首先根据子系统可提供的服务来定义子系统(以后在对象设计中再根据子系统能提供的操作来定义子系统的接口),然后对子系统细化,建立层次结构。要求对子系统的分解尽可能做到高内聚、低耦合。5.4.1系统设计的概念5.4系统设计86软件工程1) 子系统和类在应用领域,为降低其复杂性,用类进行标识。在解答空间,为降低其复杂性,将系统分解为多个子系统,这些子系统又由若干表示解答空间的类构成。还可以把子系统分解为更小的子系统。系统部分子系统类**87软件工程在Java和Module2中显式地提供了子系统的构造。在Java中采用了“包”,在Modula2中采用了“模块”。C++没有显式地提供子系统的构造,可按问题需要对类分组。2)

服务和子系统接口一个服务是一组有公共目的的相关操作。而子系统的特征是由该子系统提供给其他子系统的服务来刻画。供其他子系统调用的某个子系统的操作集合就是子系统的接口。子系统的接口包括操作名、操作参数类型及返回值。88软件工程系统设计注重每个子系统提供服务的定义,即枚举所有的操作、操作参数和行为。当编写子系统接口的文档时,不应涉及子系统实现的细节,其目的是减少子系统之间的依赖性,希望一旦需要修改子系统实现时,降低由于子系统变更而造成的影响。3)

子系统分层和划分子系统分层的目的是建立系统的层次结构。每一层仅依赖于它下一层提供的服务,而对它的上一层可以一无所知。如图,是一个三层的系统结构。89软件工程在层次结构中,子系统A、B、E构成了一个称之为垂直切片的系统分解子集。而D、G则不能。如果每一层只能访问与其相邻的下一层,则称之为封闭体系结构;如果每一层还可访问E:子系统F:子系统G:子系统B:子系统C:子系统D:子系统A:子系统90软件工程比其相邻下一层更低的层次,则称之为开放体系结构。封闭体系结构的例子就是开放系统互联参考模型(OSI模型),它由七层构成。每一层负责执行一个已预先定义好的协议功能。每一层都为其上一层提供服务,使用其低层的服务。数据链层物理层网络层传输层会话层表示层应用层抽象层次比特流数据帧包消息接口连接格式91软件工程封闭体系结构的子系统之间满足低耦合,但产生速度和存储管理的问题,会导致某些非功能属性难以满足。开放体系结构的一个例子是Java的Swing用户接口包。它允许人们绕过高层直接访问低层接口以克服性能瓶颈。AWTXlibSwingApplication92软件工程划分是将系统分解为独立的子系统,每个子系统负责某一类服务。例如,一个车辆管理所的管理信息系统分为车管所组织机构管理、车辆管理、车主管理和法律事件管理等4个子系统。每一个子系统对其他子系统的依赖度很低。分解子系统时,首先进行划分,将一个系统分成几个高层的子系统,每个子系统负责一种功能,或运行在某特定的硬件节点上。再将各子系统分层处理,分解成层次更低的小子系统。过度分解会导致子系统之间接口的复杂化。93软件工程5.4.2系统设计的目标明确设计目标,是系统设计的第一步。有一些设计目标是从用户那里得到,更多的设计目标是从非功能需求或应用领域中抽取出来。设计目标可以从以下5组设计准则中选择。其中性能、可靠性和最终用户准则往往从需求中明确地获取,也可以从应用领域中获取;而成本和维护准则由客户和供应商提出。将设计目标清楚地陈述,可以根据设计准则,做出重要的设计决策。94软件工程性能准则设计准则定义响应时间用户提交请求后多长时间可得到系统的确认吞吐量在一段固定时间内系统能够处理多少任务内存系统运行需要占用多少内存空间可靠性准则设计准则定义鲁棒性面对非法用户进入后系统的存活能力可靠性明确期待的行为与观察到行为之间的差别可用性系统能够用来完成正常任务的时间百分比容错性在出错条件下系统的操作能力保密性系统忍受恶意攻击的能力安全性再出现错误时系统避免威胁到人类生命的能力95软件工程成本准则设计准则定义效用系统支持用户工作的困难程度易用性用户使用系统的困难程度最终用户准则设计准则定义开发成本开发系统初始版本的成本部署成本安装系统并培训用户的成本升级成本从原有系统中导出数据的成本,此准则导致了向后兼容性需求维护成本需要进行错误修复和增强系统的成本管理成本需要对系统进行管理的成本96软件工程维护准则需求的可追踪性将代码映射到特定需求上的困难程度设计准则定义可扩展性向系统中添加功能或新类的困难程度可修改性更改系统功能的困难程度可适应性将系统发送到不同应用领域的困难程度可移植性将系统移植到不同平台的困难程度可读性通过阅读源代码来理解系统的困难程度97软件工程在定义设计目标时,希望开发一个既安全可靠,又廉价的系统是不现实的,因此开发人员应当对所有可能的设计目标进行权衡,对必须的设计目标赋予优先级别。一旦有了清晰的设计目标,就可以开始系统的初始分解。权衡基本原则空间与速度如果软件的响应时间或吞吐量不满足需求,则可以使用更多的存储空间来加快软件的执行速度。如果软件太大,则可以牺牲一定的速度对数据进行压缩处理。98软件工程权衡基本原则交付时间与功能如果开发进度滞后于计划,则按时交付的功能可以少于预定交付的功能,或推迟交付所有功能。契约软件通常更强调功能,而商业外购软件则更强调交付日期。交付时间与质量如果测试滞后于计划,则可以按时交付带有错误的软件,或推迟交付带有少量错误的软件。交付时间与人员配置如果开发进度滞后于计划,可以在项目中增加资源以提高生产率。在多数情况下,这种选择只适用于早期项目。新的人员要经过培训方可使用。这样中途增加资源通常会降低生产率,还会增加软件开发的成本。99软件工程5.4.3子系统分解软件体系结构设计的第一步是做子系统分解,从而搭建软件体系结构的架构。在系统设计中寻找子系统,与在分析过程中寻找对象的情况类似。在面向对象分析中介绍的Abbotts启发式准则,同样适合于子系统的识别。初始子系统应该从需求的功能模型(用例模型)中导出。这方面有多种分解方案。例如,Coad&Yourdon基于MVC模型,将系统大致分为问题领域、人机交互、任务管理、数据管理等4个子系统。100软件工程5.4.4问题领域子系统首先复制分析模型为设计模型中的问题领域部分,然后根据设计目标,对该部分进行修改。可复用的设计/编程方面的类

根据需要,从类库选择可复用类、商业外购构件和遗留构件,把它们增加到问题解决方案中去。标明复用类或构件中不需要的属性和操作。增加从复用类(构件)到分析类之间的泛化关系,继承复用类(构件)的属性和方法。101软件工程把分析类中因继承复用类(构件)而成为多余的属性和操作标出。修改分析类的结构和连接。加入泛化类以建立类间协议有时某些分析类要求一组类似的服务。此时,以这些分析类作为子类,定义一个父类。该父类定义为所有这些子类共用的一组服务名,作为公共的协议,用来与数据管理或其他外部系统部件通信。这些服务都是虚函数。在各个子类中定义其实现。对泛化关系进行调整102软件工程在分析模型中可能包括有多继承关系,但实现时使用的程序设计语言可能只有单继承,甚至没有继承机制,这样就需变更问题领域部分中类的层次结构。针对单继承语言的调整

把子类对象看做是父类对象所扮演的角色,通过关联关系把多继承的层次结构转换为单继承的层次结构。把多继承的层次结构平铺,成为单继承的层次结构。在这种情况下,有些属性或操作在同层的子类中会重复出现。103软件工程针对无继承语言的调整当使用无继承的编程语言时,必须把具有泛化关系的类层次平铺开,成为一组对象。多继承关系通过关联关系分解多继承平铺为单继承人医生教授医学教授人角色医生教授1*人医生教授医学教授104软件工程修改设计以提高性能提高执行效率是系统设计的主要目标之一。有时必须改变问题领域的结构以提高效率。如果类之间经常需要传送大量消息,可合并相关的类,使得通信成为对象内的通信,而不是对象之间的通信,或者使用全局数据作用域,打破封装的原则,以减少消息传递引起的速度损失。增加某些属性到原来的类中,或增加低层的类,以保存暂时结果,避免每次都要重复计算造成速度损失。105软件工程为提高性能,在对分析模型进行大规模的改动之前,应考虑下面一些问题:不要认为象C++之类的OOPL就一定效率不高。事实表明,非OOPL的紧凑代码的效率比OOPL的效率高近10倍,但用非OOPL编程会令程序员非常疲劳,容易出错。提高一个现存系统的工作效率比重新设计一个高效的系统要容易。一开始应当建立一个原始的简单的设计,实现和调试不会太困难。如果对设计有性能要求,只需加入少量的工作就可以了。106软件工程通常系统80%的开销都集中在20%的代码段上。与其为了尽量处处节省系统开销而破坏完善的系统结构,还不如找出系统开销最集中的地方,只对那部分做优化。预测软件开销集中在什么地方是困难的。进行优化最有效的方法是在系统运行时使用性能监测工具对系统进行观测。一些像继承、动态绑定、消息传递等处理虽然看起来简单,但需要大量的系统开销。在代码复杂性与运行的低效之间没有相关性。提高性能最好的方法是采用好的解决方案,而不是拼命地去节省几个微秒、几个字节。107软件工程电梯控制系统ECS的问题领域子系统决定使用一个中央控制器(电梯控制器)控制和协调电梯的所有动作,包括解决电梯每到一个楼层减速问题。增加“电梯监视器”,用一个独立的对象来执行监测功能(性能、安全性等)。在提交给实现者的规格说明中,将这个类放在一个与ECS的主处理器分离的处理器上.每个类增加服务SelfTest来增强每个类的性能。在运行时执行有必要验证其功能的操作,并向电梯监视器报告。108软件工程111111*1111111..*1电梯事件电梯调度器电梯控制器电梯监视器到达面板目的地面板面板楼层目的地事件召唤事件到达事件召唤面板电梯马达超载传感器电梯1..1..*109软件工程5.4.5人机交互子系统设计一个良好的用户界面是成功地实现一个软件系统的关键。在开发分析模型时,有意避开了如窗口、屏幕等依赖于实现的细节,目的是让系统规格说明独立于实现。而人机交互子系统在系统行为和用户交互的实现之间架起了一座桥梁。例如,可用GUI实现系统的用户界面。但当用户提出来改用语音对答式交互时,应当使这种改变尽可能容易。为此,只需将GUI式人机交互子系统替换成语音对答式人机交互子系统即可,系统其它部分都应保持不变。*110软件工程例如,某杂志发行系统SBSS的人机接口设计用户界面SBSS的用户界面是一个传统的GUI。其中有许多窗口对象。但在用户与系统进行交互期间,只能有一个窗口呈现在用户面前。

通过使用聚合关系,窗口对象可以进一步分解为各种文本域、选择按钮、图符等。如果使用某种GUI构筑软件包,只需对软件包输入合适的参数,该软件包就能提供所有的文本域、选择按钮、图符等,将这些细节作为窗口的属性就可以了。111软件工程订阅项目窗口续订项目窗口订阅管理选择按钮编辑管理选择按钮订阅管理窗口编辑管理窗口特殊订单窗口文章窗口作者窗口刊物窗口付款项目窗口SBSS窗口零售价格追踪基本订户追踪免费赠阅查询窗口112软件工程只要描述清楚所需要的窗口,这些窗口的导航细节,详细的窗口成分,我们就可以用现有的技术和工具来实现它们。其他描述人机交互模型的工具在描述复杂的菜单系统(GUI窗口)的拓扑结构时,常使用状态图或菜单树。用于SBSS的单层状态图:每一个状态是GUI的一个窗口每一个迁移代表了窗口之间的切换与每个迁移相关联的是一个条件/动作对条件代表了用户选择,它导致迁移的发生动作代表了迁移发生时产生的请求113软件工程SBSS订阅项目菜单特殊订单窗口帮助窗口编辑管理窗口订阅管理窗口ALT+F,X返回起始菜单ALT+S订阅管理ALT+F,X返回起始菜单ALT+D特殊订单ALT+H帮助工具ALT+F,X返回起始菜单ALT+F,X

返回起始菜单ALT+S编辑管理114软件工程菜单树可以让用户直观地看到如何在界面上巡航。用菜单树表示人机交互的基本结构,有助于全局用户界面的可视化。例如,可以了解有多少种不同的方式能够访问“地址”的窗口。用户界面可尽量采用清真 寺式的结构:在界面的上 层,希望扇出大于扇入, 表明用户可以有多个可供 选择的选项。在界面的低 层,希望扇入大于扇出, 表明一个单独的界面可以 被多个双亲使用。115软件工程SBSS订阅系统订阅管理窗口订阅事务窗口地址窗口事务认定窗口付款事项窗口查询窗口查询显示窗口(a)查询显示窗口(b)查询显示窗口(c)查询显示窗口(d)查询显示窗口(e)编辑管理窗口作者编辑/显示窗口文章编辑/显示窗口刊物编辑/显示窗口地址窗口事件挂起窗口开始菜单/帮助窗口特殊订单窗口地址窗口付款事项窗口菜单树116软件工程人机交互子系统的设计过程1) 用户分类按技能层次分类:外行/初学者/熟练者/专家按组织层次分类:行政人员/管理人员/专业技术人员/其它办事员按职能分类:客户/职员描述人及其任务的脚本

对以上定义的每一类用户,列出对以下问题做出的考虑:谁、目的、特点、成功的关键因素、熟117软件工程

练程度以及任务脚本。 在OOATOOLTM中有一个例子:谁:分析员目的:要求一个工具来辅助分析工作(摆脱繁重的画图和检查图的工作)。特点:年龄:42岁;教育水平:大学;限制:不要微型打印,小于9个点的打印太小。成功的关键因素:工具应能使分析工作顺利进行;工具不应与分析工作冲突;工具应能捕获假设和思想,能适时做出折衷;应能及时给出模型各个部分的文档。118软件工程熟练程度:专家。任务脚本:主脚本:识别“核心的”类和对象;识别“核心”结构;在发现了新的属性或操作时随时都可以加进模型中去。

检验模型:打印模型及其全部文档。3) 设计命令层119软件工程研究现行的人机交互活动的内容和准则。这些准则可以是非形式的,如“输入时眼睛不易疲劳”,也可以是正式规定的;建立一个初始的命令层。可以有多种形式,如一系列MenuScreens、或一个MenuBar、或一系列Icons.细化命令层。考虑以下几个问题。排列命令层次。把使用最频繁的操作放在前面;按照用户工作步骤排列。通过逐步分解,找到整体-局部模式,以帮助在命令层中对操作分块。120软件工程根据人们短期记忆的“7±2”或“每次记忆3块/每块3项”的特点,把菜单深度尽量限制在三层之内。减少操作步骤:把点取、拖动和键盘操作减到最少。设计详细的交互用户界面设计有若干原则,包括:一致性:采用一致的术语、一致的步骤和一致的活动。操作步骤少:减少敲键和鼠标点取的次数,减少完成某件事所需的下拉菜单的距离。121软件工程不要“哑播放”:每当用户等待系统完成一个活动时,要给出一些反馈信息。Undo:在操作出现错误时,要恢复或部分恢复原来的状态。减少人脑的记忆负担:不应在一个窗口使用在另一个窗口中记忆或写下的信息;需要人按特定次序记忆的东西应组织得容易记忆。学习的时间和效果:提供联机的帮助信息。趣味性:尽量采取图形界面,符合人类习惯。122软件工程5) 继续做原型开发用户界面原型,可对提交的人机交互活动进行体验、实地操作,并精炼成一致的模式。使用快速原型工具或应用构造器,对各种命令方式,如菜单、弹出、填充以及快捷命令,做出原型让用户使用,通过用户反馈、修改、演示的迭代,使界面越来越有效。设计人机交互类对窗口进一步细化,通常包括:类窗口、条件窗口、检查窗口、文档窗口、画图窗口、过滤123软件工程

器窗口、模型控制窗口、运行策略窗口、模板窗口等。设计人机交互类,首先从组织窗口和部件的用户界面界面的设计开始。每个类包括窗口的菜单条、下拉菜单、弹出菜单的定义。还要定义用于创建菜单、加亮选择项、调用相应响应的操作。根据图形用户界面进行设计建立图形窗口,确定字型、坐标系统。建立事件响应机制。124软件工程设计人机交互子系统的启发式准则每一个组织和用户都有其文化背景。可能不仅仅意味着语言、传统和习惯。由于所建立的系统面对的是用户,因此,其界面必须必须与用户的文化背景相一致。 一种适应用户文化背景的有效方法是“可视化表示”。目的是让计算机界面适应用户。例如有一个客户开发了一个财务管理软件,它以政府规定的各种计算方法和表格作为其可视化表示。对于这样的用户界面,学习和掌握它非常简单和容易。125软件工程使用用户开发的场景或使用事例来驱动界面。为避免用户界面太复杂,先观察用户是如何完成其工作的。在执行一个特定的工作时,用户界面应能告诉用户下面将做什么。应当首先定义一个高层的用户界面和一些详细的对话框,然后定义人机交互对象,从而完成设计。需要建立原型对所有人机交互界面设计进行严格的检验。人机交互子系统的设计应从建立分析模型时就开始着手。在开发系统的人机交互子系统时,应允许用户对其试用。126软件工程多数用户都不会从头开始设计人机交互类。事实上,使用各种所谓的可视化开发环境,如Delphi,PowerBuilder、VasualBasic、VasualC++、BorlandC++builder等,开发人员可能连人机交互子系统都不要。直接使用这些工具提供的控件,就可以作出用户界面。 用户可以不需要HIC,但不能免去用户界面的设计。使用菜单树或状态,连同某些原型,来说明用户界面的设计思想。127软件工程5.4.6任务管理子系统在应用中,每一个对象中的每一个服务最终都要被分配给某一个计算机任务。这样一些任务可以被看作是一些独立的可调度的实体。通常任务管理子系统的任务为:将子系统映射到构件和处理器上标识并存储持久性数据提供访问控制设计全局控制流通常利用UML构件图和部署图展示。128软件工程129软件工程构件图(Componentdiagram)构件图展现了一组构件之间的组织和依赖。构件图专注于系统的静态实现视图。它与类图相关,通常把构件映射为一个或多个类、接口或协作。一个构件可能是:

部署构件:如动态链接库(DLL)、二进制可执行构件、ActiveX控件、JavaBeans等,是形成可执行文件的基础。工作产品构件:如数据文件或源代码。是部署构件的来源。执行构件:可运行的构件130软件工程构件图的事例CourseCourseOfferingStudentProfessorCourse.dllPeople.dllCourseUserRegister.exeBilling.exeBillingSystem131软件工程接口(interface)接口是一个类或构件提供给其他类或构件的一组操作。类的变体,其变体关键字是<<interface>>。每个接口要指定一个名字,以区分不同的接口。接口的名字就是类的名字,用字符串表示。构件的接口有两种类型:导入接口(importinterface):访问服务的构件使用导入接口;导出接口(exportinterface):由提供操作的构件提供。132软件工程部署图(DeploymentDiagram)部署图展现了在软件过程中存在的运行处理节点以及其中的构件的配置。部署图给出了体系结构的静态实施视图。它描述系统硬件的物理拓扑结构(包括网络布局和构件在网络上的位置),以及在此结构上执行的软件(即运行时软构件在节点中的分布情况)。它与构件图相关,通常一个节点包含一个或多个构件。133软件工程部署图的事例RegistrationDatabaseDormLibraryMainBuilding主排课数据库宿舍图书馆注册134软件工程(1)将子系统映射到构件和处理器选择硬件配置和平台许多系统运行在网络上。使用多台计算机,可以满足高性能计算需求和多个互联的分布式用户需求。确保将子系统分布到多台计算机上,设计基础设施来支持子系统之间的通信。选择硬件配置包括选择虚拟机,系统将在其上运行。虚拟机包括操作系统和所需软件构件,如数据库管理系统和通信包。构件提供的功能越多,所需的开发工作量越少。虚拟机的选择还受客户约束和成本限制影响。135软件工程例如,在车辆路程规划系统中,规划子系统和路由子系统运行在两个不同的节点上。硬件分配的情况如下:将对象和子系统分配到节点上:OnBoardComputerRoutingsubsystem:WebServerPlanningsubsystem将路由子系统分配到车载计算机上规划子系统分配到基于Web的网络服务器上136软件工程将对象和功能分配到各个节点上时,为了在节点之间传输数据,需对新加入的对象和子系统进行标识。例如,在车辆路程规划系统中,路由子系统和规划子系统共享了行程类、目的地类、交差口类、路段类和方向类的实例,它们需采用一些通信协议,可通过无线调制解调器进行通信,可创建一个通信子系统来支持该通信。旅途规划的内容分布在路由和规划子系统中,在路由子系统中创建路段代理类和行程代理类为规划子系统中的路段和行程提供代理服务。137软件工程当司机需要重新规划行程路线时,行程类对象会向通信子系统发出请求,检索规划子系统中有关路段的信息。最后,通信子系统将一个完整的旅途线路从规划子系统转移到路由子系统中。通信子系统消息连接规划子系统规划服务行程路口方向目的地行程段路由子系统线路助手位置行程代理路段代理138软件工程将某一子系统分配到硬件节点上,意味着能够将功能和处理能力分配到最需要这些子系统的地方。随之而来的问题就是子系统中的数据存储、数据转移、数据复制和同步数据等问题。持久性数据的生存周期要长于系统的一次执行周期。例如,在图书管理系统中将借阅者借阅的图书信息和借阅者信息记入借阅记录并存储在数据库相应文件中,该文件以后可以再次打开。数据在系统中的存储位置和存储方式将会影响到(2)标识并存储持久性数据139软件工程 系统的分解。特定数据库管理系统的选择也会影响全局控制策略和并发管理。例如,在车辆路程规划系统中,把当前行程信息存储在磁盘文件中是最简单、最有效的。为此,在系统中添加行程文件存储子系统和映射数据库存储子系统。前者负责将旅程路线信息存储到车载计算机的文件中。该文件只支持整个旅程数据的快速存储和载入,以在车辆故障恢复时使用。后者负责将地图和旅程数据存储到规划子系统的数据库中。该子系统支持多个并发的的司机和规划代理。140软件工程标识持久性对象。候选的持久性数据是从分析过程中标识出的实体类对象,以及边界类对象。通常可以在系统关闭后,检查所有必须保存的类,以标识出必须长久保存的持久性对象。这里的系统关闭可以是受控关闭,也可以是系统崩溃。行程文件存储子系统通信子系统映射数据库存储子系统路由子系统规划子系统141软件工程选择存储管理策略。决定如何存储这些持久性对象的决策常常受到如下非功能属性的制约:对象能否快速检索出来是否必须执行复杂的查询来检索这些对象这些对象是否需要大量的内存和磁盘空间在多用户系统中,不同参与者对不同的功能和数据可有不同的访问权限。例如,一个普通用户参与者可能仅能访问其所创建的数据,而一个系统管理员参与者对系统数据(3)提供访问控制142软件工程 和所有用户数据具有无限的访问权限。在需求获取和分析建模过程中,将不同用例关联到不同的参与者;在系统设计过程中,定义共享对象、参与者通过访问控制进行访问的权限、数据加密的方式等。例如,在车辆行程规划系统中,在同一数据库中存储地图信息和行程信息会引发安全问题,必须确保行程仅被发送给创建这些行程的司机。为此,可将司机类与行程类关联起来。规划子系统负责在发送行程之前对司机进行识别,最后根据两子系统之间的通信信息是否加密进行决策。143软件工程可以用访问矩阵对类的访问控制进行建模:矩阵的行列出系统中的参与者矩阵的列列出要进行控制的类矩阵元素列出参与者在类实例上能执行的一组操作,也称为访问权。访问矩阵定义了静态访问控制。还可以采用代理模式定义动态访问控制。例如,可以为每一个被访问的类实例创建一个代理对象,由代理对象检查访问者的访问权限。如果访问者具有相应的访问权限,则访问可执行,否则,访问失败。144软件工程(4)全局控制流设计典型的控制流机制有三种:过程驱动控制事件驱动控制线程机制一旦选择了控制流机制,就可以采用一个或多个控制对象来实现它。控制对象的作用是记录外部事件,存储其有关状态,给出接口上的操作调用、与外部事件相关联的实体对象操作调用的正确顺序。145软件工程5.4.7数据管理子系统数据管理子系统提供了在数据管理系统中存储和检索对象的基本结构,包括对持久性数据的访问和管理。它分离了数据管理机制所关心的事项,包括文件、关系型数据库管理系统或面向对象数据库管理系统等。数据管理的方法主要有3种:文件管理、关系数据库管理和面向对象数据库管理。下面给出选择数据管理方法的规则。146软件工程类型选择规则(1)存在大量的数据(如图像)文件(2)存在临时数据(如内存文件)(3)存在低密度信息(如档案文件、历史日志)关系型或(1)存在并发访问面向对象(2)访问比较合适的细节层数据库(3)对相同数据的多重平台或应用关系型(1)属性上的复杂查询数据库(2)存在大数据量面向对象(1)为检索数据扩展关联的使用数据库(2)中等规模的数据集(3)对象之间的不规则关联147软件工程文件是一种由操作系统提供的数据组织,应用程序以字符流的形式存储其数据。应用程序可定义用什么方式、在什么时间来检索这些对象。但文件使用时必须考虑很多问题,如并发访问和系统崩溃情况下的数据丢失问题。关系数据库管理系统可以遵照预先定义好的结构类型进行存储。它使用若干表格来管理数据,表中每一列代表一个属性,每一行代表一个属性元组值的数据元素。这种类型的数据库提供了并发管理、访问控制和故障恢复服务,但对非结构化数据(如图像、自然语言文本),速度较慢。148软件工程面向对象数据库管理系统提

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论