面向对象的分析与设计中国软件行业协会教育与培训委员会2初始访谈业务所属人获取高层的功能性需求访谈项目干系人获得所有的功能性和非功能性需求通过SRS文档确定项目约束和风险通过SRS文档中的功能性需求创建项目词典通过SRS文档创建初始用例图业务所属者脑海中的模型项目干系人脑海中的模型愿景文档SRS2020/7/5创建初始用例图用例图是“表示了系统内的参与者与用例之间关系的一个图”(UMLv1.4specpageB-21)2020/7/5参与者(Actors)•参与者就是代表与系统进行交互的角色这个图标代表了系统的human类型的参与者这个图标能代表参与者是一个外部系统这个图标代表激活用例的时间触发器2020/7/5用例(UseCases)•一个用例封装了为达到某个成果的系统的主要行为•用例是用椭圆形表达的,它内部的文字就是用例的标题•用例编码能够被用在标题的前面,用来建立与SRS的对应关系一个用例描述了为实现某个有价值的成果,在参与者与系统之间进行的交互。2020/7/5系统边界“用例可选择附在一个长方形里表示系统内部的边界(UMLv1.4spec.page354)”系统的边界是随意的这个等价的用例图表示了一个透明的系统边界2020/7/5用例关联用例关联描述了“在用例中一个用户的参与。”(UMLv1.4spec.page357)•一个参与者必须关联一个或者多个用例•一个用例必须关联一个或者多个参与者•它们之间的关联是用一条没有箭头的实线来表示的2020/7/5中国软件行业协会教育与培训委员会9精化用例表格要素描述前置条件和假设用例被调用时的(系统)状态触发条件通知参与者用例应该被调用的条件主事件流组成此用例的用户动作的执行序列可选事件流任何可能发生的次要的操作和事件后置条件用例完成时系统应该所处的状态非功能性需求与用例相关的非功能性需求列表。可以是非功能性需求的概述,也可以是需求规约中的非功能性需求的编码列表2020/7/5创建用例表按照下面的步骤确定用例表中应填写的信息:1.依照SRS文档来填写数据。2.依据用例场景决定前置条件;3.依据用例场景决定触发条件;4.依据用例主要用例场景决定主事件流;5.依据用例次要用例场景决定可选事件流6.决定后置条件2020/7/5第一步—根据需求规约文档填写相关信息根据需求规约文档填写下列元素:用例标识和名称E1:管理预定描述此用例用于在房间出租中创建一个新的预约参与者主要:预约代理次要:招待员、管理人员、业主优先级基本的(Essential)非功能性需求E1-102(性能)E1-105(可扩展性)E1-108(可靠性)2020/7/5第二步—根据用例场景确定前置条件一个好的用例场景应该在第一段就描述用例开始时系统的状态。它们就是前置条件:SantaCruz的床位和早餐的预约代理MedocaSansumi正耐心地等着电话,此刻旅店管理系统的主页面已经被打开。前置条件预定代理正在等电话旅店管理系统的主页面已被打开2020/7/5第三步—根据用例场景确定触发条件用例场景还应该陈述参与者如何才能知道应该去启动一个特定的用例。这时候,来自纽约的Ms.JaneGoogol打来了电话,Ms.JaneGoogol说“你好,我是Ms.JaneGoogol。我想为新年前夕预约房间”。触发条件消费者打来电话要求预定2020/7/5第四步—根据主要用例场景确定主事件流根据主要用例场景确定主事件流。Medoca:“你什么时候入住?”。Jane:“12月31日,我会一直住到1月5日”。Medoca在表格中输入日期。Medoca:“你想要什么类型的房间?”。Jane:“我和我丈夫住一块,所以一间单人房就足够了。还有没有雅间?”Medoca在定单表中选择“单人房间”并做查询。主事件流……3.接待员输入查询条件4.接待员查询房间安排表以确定可用房间5.系统显示在指定范围内的可用房间6.接待员选择一个房间……2020/7/5第五步—根据次要用例场景确定可选事件流根据次要用例场景确定可选事件流。•在主要场景和每一个次要场景之间按顺序做差异分析。•可选事件流就是主要场景和次要场景中不同的那些步骤。可选事件流在第5步中,如果没有房间可用,预约代理会提示消费者选择不同类型或者不同日期的房间,返回到第3步2020/7/5第六步—决定后置条件一个好的用例场景应该在最后一段描述用例结束时系统的状态。它们就是后置条件。Medoca把系统提供的预约编号告诉Jane:“你还需要什么帮助吗?”Jane:“没有了。”Medoca向她表示感谢并挂断电话。Medoca关闭预约窗口,返回旅店管理系统MainHotelApp主页面。后置条件预约被存入数据库,预约单窗口被关闭,系统回到主界面2020/7/5展开高级用例一些在需求捕获阶段获取的用例太高级。这种情况就要引入新的用例来分解工作流。2020/7/5展开高级用例(续)优化前的用例图:2020/7/5展开高级用例(续)展开版本产生了更多的联系:2020/7/5参与者继承一个参与者可以继承父参与者的所有用例关系:2020/7/5用例的特殊化一个用例可以派生出多个特殊化的用例:用例特殊化通常由用例场景的多样性来决定。2020/7/5分析用例依赖用例可以以两种方式依赖于其他用例:•一个用例(a)包含(include)另外一个用例(b)。用例a需要用例b的功能并且总是执行这个内含的用例。•一个用例(a)扩展(extend)另外一个用例(b)。用例a可能(可选择的)用到用例b的功能,于是去扩展用例b。2020/7/5确定和记录系统的通用行为。回顾用例场景找到通用行为。给这个通用的行为取一个名字并在用例图中绘制出包含关系。include依赖2020/7/5依赖使你找出那些不属于主事件流,而是可选场景中的系统行为。2020/7/5依赖识别和记录与用例可选事件流有关的行为。•回顾用例场景找出重要的行为序列。•给这个行为取一个名字并在用例图中绘制出扩展关系2020/7/5中国软件行业协会教育与培训委员会27用活动图来验证用例在活动图中描绘用例的主事件流:2020/7/5中国软件行业协会教育与培训委员会29软件需求说明书中的名词•以下是从酒店预定系统的需求说明书中摘录的一部分,名词用蓝色标记.“酒店预定系统负责管理多种类型的酒店预定,包括(但不仅限于)B&B,还有一些商务酒店预定.这个系统同时也包含了一个web应用,允许客人随时查看房间和酒店,查看当前和过去的预定记录,或者进行新的预定.系统同时也能调整一些小事件(例如商务和小型会议)”2020/7/5候选的关键抽象表格(示例)候选的关键抽象排除的原因选定的名字预定预定酒店酒店商务酒店酒店的子类客人客人房间房间小型商业会议预定的子类信用卡验证系统一个外部系统姓名客户的属性地址2020/7/5中国软件行业协会教育与培训委员会32建立域模型(续)从关键抽象,你可以利用这些步骤创造域模型:1.每个关键节点画类抽象并且:a.列出已知属性b.列出已知操作2.画协作类之间的管理3.定义并记录相关文件的名称和作用4.定义并记录关联重数5.定义并记录关联方向6.定义并记录关联类2020/7/5中国软件行业协会教育与培训委员会34第二步-画关联2020/7/5中国软件行业协会教育与培训委员会36第四步-填入关联重数2020/7/5中国软件行业协会教育与培训委员会38第六步-画关联类2020/7/5()close()edit()save()edit()CleanDirty使用鲁棒性分析为用例创建一个设计模型通过合并设计和架构模型来创建解决方案模型精化域模型来满足解决方案模型应用设计模式到域模型和解决方案模型中使用状态图确定并建立复杂对象状态的模型ServerClientTCP用例表鲁棒分析2020/7/5鲁棒性分析鲁棒性分析是这样一个过程,它引导我们从用例转换为支持用例的模型:需求模型设计模型SRS用例模型域模型2020/7/5鲁棒性分析(续)鲁棒性分析的输入:一个用例这个用例的用例场景这个用例的活动图(如果可以用到)域模型(domainmodel)鲁棒性分析的输出:通过一个UML序列图和一些设计组件:边界、服务、实体组件,我