1、n教学目标掌握面向对象分析的基本方法和过程,掌握对象模型、动态模型、功能模型的创建。n教学重点对象模型的创建方法和过程。n教学难点从结构化分析方法向面向对象分析方法的过度。第 10章 面向对象分析第 10章 面向对象分析n10.1 面向对象的基本过程n10.2 需求陈述n10.3 建立对象模型n10.4 建立动态模型n10.5 建立功能模型n10.6 定义服务n10.7 小结分析过程得出的最重要的文档资料是软件需求规格说明 (在面向对象分析中,主要由对象模型、动态模型和功能模型组成 )。面向对象分析 (OOA)的关键是识别出问题域内的类与对象,并分析它们相互间的关系,最终建立起问题域的简洁、精
2、确、可理解的正确模型。在用面向对象观点建立起的三种模型中,对象模型是最基本、最重要、最核心的。10.1 面向对象的基本过程10.1.1 概述面向对象分析,就是抽取和整理用户需求并建立问题域精确模型的过程。面向对象开发过程的应用生存期模型OOAOOD10.1 面向对象的基本过程什么是论域 人们议论物价时 ,一切经济问题就成为论域 ,而医疗保健问题则是论域之外的客体。定义 2:任何科学理论中有它的研究对象,这些对象构成一个不空的集合,称为论域。论域中的元素,即所谓的研究对象,称为个体,一个理论还要研究个体之间的关系以及作用于个体的函数。OOAOOD10.1 面向对象的基本过程论域分析论域分析是软件
3、开发的基本组成部分 ,目的是使开发人员了解问题空间的组成 ,建立大致的系统实现环境 .论域分析给出一组抽象 ,从高层表示论域知识 ,常常超出当前应用的范围 ,作为特定系统需求开发的参考 .论域分析实际上是一种学习 ,软件开发人员在这个阶段尽可能地理解当前系统与应用有关地知识 .应放开思维 ,放宽考虑地领域 ,近可能标识与应用有关地概念 .论域分析地边界可能很模糊 ,有了广泛地论域知识 ,涉及到具体地应用时 ,就可以更快地进入情况 ,掌握应用的核心知识 .而且 ,在用户改变对目标系统的需求时 ,广泛的分析可以帮助我们预测出目标系统在哪些方面会发生哪些变化 .通常进行小组分析 ,小组成员可以包括领
4、域专家和分析员等 .在分析过程中标识出系统的基本概念 :对象 ,类 ,方法 .关系等 .识别论域概念之间的关系 ,还有关于每个单独概念的全部信息 .这里信息起一种胶合作用 ,把标识出的相关概念并入论域综合视图中去 .OOAOOD10.1 面向对象的基本过程应用分析应用分析时依据在论域分析时建立起来的问题论域模型 ,并把问题论域模型用于当前特定的应用之中 .首先 ,通过收集到的用户信息来对论域进行取舍 ,把用户需求作为限制来使用 ,缩减论域的信息量 .因此论域分析的视野大小直接影响到应用分析保留的信息量 .一般来说 ,论域分析阶段产生的模型并不需要用任何基于计算机系统程序设计语言来表示 ,而应用
5、分析阶段产生的影响条件则通过某种局域计算机系统的程序设计语言来表示 .模型识别的要求可以针对一个应用 ,也可以针对多个应用 .通常我们着重考虑两个方面 ,即应用视图和类视图 .在类视图中 ,必须对每个类的规格说明和操作进行详细化 ,并表示类之间的相互作用 .OOAOOD10.1.1 概述获取用户基本需求获取用户基本需求标识类和对象标识类和对象定义类的结构和层次定义类的结构和层次表示类表示类 (对象对象 )间的关系间的关系为对象行为建模为对象行为建模OOA分析过程面向对象建模得到系统 3子模型:静态结构 对象模型交互时序 动态模型数据变换 功能模型任何问题,都需要从客观世界实体及实体间相互关系抽
6、象出极有价值的对象模型;当问题涉及交互作用和时序时,动态模型是重要的;解决运算量很大的问题,则涉及重要的功能模型。动态模型和功能模型中都包含了对象模型中的操作 (即服务或方法 )。10.1.2 3个子模型与 5个层次复杂问题的对象模型通常由下述 5个层次组成:主题,称为子系统 (subsystem),是将一些联系密切的类组织在一起的类的集合。按照粒度控制原则,将系统组成几个主题,便于理解。给出系统中所有反映问题域和系统责任的类(对象)给出各类(对象)间关系,包括继承、组装、一般 特殊 、整体 部分、属性的静态依赖及操作的动态依赖关系。给出系统中所有类(对象)的属性给出系统中所有类(对象)的服务
7、这 5个层次,一层比一层显现出对象模型的更多细节。在概念上,这 5个层次是整个模型的 5张水平切片。上述 5个层次对应着在面向对象分析过程中建立对象模型的 5项主要活动:找出类与对象识别结构识别主题(包)定义属性定义服务(函数)“ 5项活动 ” 不是 5个步骤,事实上,这 5项工作完全没有必要顺序完成,也无须彻底完成一项工作以后再开始另外一项工作。10.1.2 3个子模型与 5个层次在概念上可以认为,面向对象分析大体上按照下列顺序进行:寻找类与对象,识别结构,识别主题,定义属性,建立动态模型,建立功能模型,定义服务。但是,分析不可能严格地按照预定顺序进行,大型、复杂系统的模型需要反复构造多遍才
8、能建成。通常,先构造出模型的子集,然后再逐渐扩充,直到完全、充分地理解了整个问题,才能最终把模型建立起来。10.1.2 3个子模型与 5个层次10.2 需求陈述10.2.1 书写要点需求陈述的内容包括:问题范围,功能需求,性能需求,应用环境及假设条件等。需求陈述应该阐明 “做什么 ”,指出哪些是系统必要的性质,哪些是任选的性质。不能指望没有经过全面、深入分析的需求陈述是完整、准确、有效的。随后进行的面向对象分析的目的,就是全面深入地理解问题域和用户的真实需求,建立起问题域的精确模型。10.2.2 例子n 一个小型地区航空公司需要一个应用程序 , 用于统计航班预定和机票收入情况 .10.2.2
9、例子n 一个小型地区航空公司需要一个应用程序 , 用于统计航班预定和机票收入情况 .n 一 : 工程和包n ( 1)创建新工程n ( 2)创建新包n 操作步骤 : 在 模型图中创建一个新包 , 命名为 ProblemDomain.n 操作步骤 : 在 模型图中再创建两个包 : UserInterface 和 DataManagement.n ( 3)显示包依赖关系n 操作步骤 : 创建从 UserInterface 到 ProblemDomain 的依赖关系 . 二 : 需求与用例图n 预定航班 .n 购买机票 .n 确定航班上是否还有足够的座位可以预定 .n 计算航班的机票收入总数 .n (
10、 1)创建新的模型图n 操作步骤 : 创建一个新的用例图 , 命名为 MakeReservation. 创建完成后 , 在当前模型图中放一个 MakeReservation 的快捷连n 接 .n ( 2)创建角色 , 用例和系统边界n 操作步骤 : 在模型图中放置一个系统边界 , 并将其命名为 Airline Reservation System.n 操作步骤 : 创建三个角色 : Passenger, Finance Officer, 和 Agent.n 操作步骤 : 创建四个新的用例 :n 1. Make a Reservationn 2. Check Availabilityn 3. B
11、uy a Ticketn 4. Find Ticket Revenue二 : 需求与用例图n ( 3)连接模型元素n 模型图中 Agent 将参与三个用例 . Passenger 将参与两个用例 , Finance Officer 只参与一个用例 .n 操作步骤 : 创建通信连接 :n 1. 从 Passenger 到 Make a Reservationn 2. 从 Passenger 到 Buy a Ticketn 3. 从 Agent 到 Make a Reservationn 4. 从 Agent 到 Buy a Ticketn 5. 从 Agent 到 Check Availabil
12、ityn 6. 从 FinanceOfficer 到 Find Ticket Revenue二 : 需求与用例图n 操作步骤 : 连接用例 :n 1. Buy a Ticket 扩展 Make a Reservation.n 2. Make a Reservation 包含 Check Availabilityn 操作步骤 : 确定所有的用例都在系统边界内 . 如果需要的话 , 拖动用例并调整系统边界的大小 .二 : 需求与用例图三 : 业务规则与活动图n 业务规则中包含了问题的部分需求 . 在前面用例图的讨论中我们将航空公司的需求限制为以下四点 :n 预定航班 .n 购买机票 .n 确定航班
13、上是否还有足够的座位可以预定 .n 计算航班的机票收入总数 .三 业务规则与活动图n ( 1)基于业务规则创建活动图n 操作步骤 : 在 模型图中新建一个活动图 , 命名为 Request Reservation.n ( 2)使用泳道来组织活动 , 开始状态和结束状态n 我们把 “预定航班 “ 的请求分为三个部分 .n Airplane/Flight Description 用于航班容量n Flight Reservations 用于已预定信息的列表n Reservation/Ticket Services 用于创建预定信息并发出机票n 操作步骤 : 在模型图中建立三个泳道 .n 1. Air
14、plane/Flight Description 在左侧n 2. Flight Reservations 在中间n 3. Reservation/Ticket Services 在右侧三 : 业务规则与活动图n 操作步骤 : 在模型图顶部 (泳道上方 )放置一个开始状态 , 在泳道下方放置一个结束状态 .n ( 3)创建活动和转换n 操作步骤 : 创建一个活动 , 命名为 Receive request, 并将它放置在 Flight Reservations 泳道内 . 将一个转换从开始状态连接到这个活动 .n 操作步骤 : 再创建五个活动 “n 1. Get capacity (cap) -
15、 在 Airplane/Flight Description 涌道中n 2. Get #tickets - 在 Flight Reservations 涌道中n 3. Create reservation- 在 Flight Reservations 涌道中n 4. Refuse request - 在 Flight Reservations 涌道中n 5. Issue ticket - 在 Reservation/Ticket Services 涌道中三 : 业务规则与活动图n 使用分支 , 合并和决策改变控制流n 操作步骤 : 创建一个分支 . 创建一个从 Receive request
16、到分支的转换. 然后创建从分支到 Get capacity 和到 Get #tickets的转换 .n 操作步骤 : 创建一个合并 . 然后创建从 Get capacity 和 Get #tickets 到合并的转换 .n 操作步骤 : 创建一个决策节点 , 用于比较航班售出的机票数和它的容量 . 创建从合并到决策的转换 . 然后创建从决策到 Createn reservation 和到 Refuse request 的转换 .n 操作步骤 : 为决策种流出的转换设置如下边界条件 :n 流向 Create reservation 的转换 , 将边界条件设置为 #tkt = cn 将 “requ
17、irement type“属性设置为 “business rule“. 输入注释信息 , 供以后生成工程文档时使用 .三 : 业务规则与活动图n 操作步骤 : 创建第二个决策 . 创建四个转换 :n 1. 从 Create reservation 到新建决策n 2. 从新建决策到 Issue ticket. 边界条件设置为 : ticket nown 3. 从新建决策到 stop. 边界条件设置为 : ticket latern 4. 从 Refuse request 到 stop.n 5. 从 Issue ticket 到 stop.三 : 业务规则与活动图四 : 模型图与类n 创建新类n
18、下面是 airline 工程得最初需求 .n 预定航班 .n 购买机票 .n 确定航班上是否还有足够的座位可以预定 .n 计算航班的机票收入总数 .从这些需求 , 我们可以得到五个类 . 下表中列出了这些类及其特性和操作 . 这仅仅是一个开始 . 继续深入下去 , 你将发现需要更多的类和类成员 .四 : 模型图与类n 操作步骤 : 在 ProblemDomain 包中创建五个类 : FlightDescription, ScheduledFlight, Reservation, Ticket, 和 Agent.n 操作步骤 : 使用 Designer 面板将 ScheduledFlight 类
19、改名为 Flight.n 操作步骤 : 在 模型图中将 ProblemDomain 包改名为 AirlinePD.四 : 模型图与类n 在 Together 外部编辑源代码n 操作步骤 : 用外部编辑器打开 FlightDescription.java 文件 . 增加两个 String 类型地成员 , origin 和 destination, 然后在编辑器中保存文件 .n 操作步骤 : 格式化新录入的两行 Java 代码 (origin 和 destination 的声明 ), 使得代码缩进 , 而不是向左对齐 .四 : 模型图与类n ( 3)增加特性n 操作步骤 : 在 Designer
20、面板中为 Reservation 类增加 name 成员 (类型为 String).n 操作步骤 : 修改 Reservation 类中 name 特性的属性 .n 1. 将初始值设置为 null 字符串 .n 2. 将 “Requirement description“ 设置为 “Last name first“.n 3. 将 “author“ 设置为你的名字 .n 操作步骤 : 在 AirlinePD 的五个类中增加新的特性 . 用 Designer 面板 , 而不要用 Editor 面板 .n 1. Agent - name : String (从 Reservation 类复制 ) n
21、 2. FlightDescription - departureTime:Date, arrivalTime:Date (下一节中再增加 capacity 特性 .)n 3. Flight date:Daten 4. Ticket basePrice:double四 : 模型图与类n ( 4)增加操作n 操作步骤 : 在 Flight 中增加一个无返回值的操作 , 命名为 makeReservation. 为这个操作设置两个参数 :n 1. name, 类型为 String, 表示乘客姓名 .n 2. tKind, 类型为 int, 表示机票类型 .n 操作步骤 : 使用 Designer 面板将 makeReservation() 从 Flight 复制到 Agent 中 .n 操作步骤 : 为 Reservation 类增加以下操作 .n 构造方法 , 包括一个 String 类型参数 (name) 和一个 int 类型参数 (tKind)n ticketPurchased() 方法 , 返回值为 boolean 类型n calcPrice() 方法 , 返回值为 double 类型四 : 模型图与类