1、h1第十章 面向对象分析10.1 面向对象分析的基本过程10.2 需求陈述10.3 建立对象模型10.4 建立动态模型10.5 建立功能模型10.6 定义服务10.7 小结 h210.1 面向对象分析的基本过程l面向对象分析 (1)其关键是识别出问题域内的类与对象,并分析它们相互间的关系,最终建立起3种模型。(2)对象模型最基本、最重要、最核心。h310.1 面向对象分析的基本过程l3个子模型 对所解决问题的描述角度进行划分:对象模型(静态结构)3个子模型 动态模型(交互次序)功能模型(数据变换)h410.1 面向对象分析的基本过程l5个层次 复杂问题的对象模型的5个层次五个层次像是对象模型的
2、5张水平切片,一层比一层显示出对象模型的更多细节。类或对象间的关系指读者理解大型、复杂模型的一种机制,将一个大型的、复杂的对象模型分解成几个不同的概念范畴(记忆的7+2原则)h5l面向对象分析的过程l 寻找类与对象l 识别结构l 定义属性l 建立动态模型l 定义服务 10.1 面向对象分析的基本过程面向对象分析不可能严格地按预定顺序进行,大型、复杂系统的模型需要反复构造多遍才能建成。先构造模型的子集,再到完全地理解整个问题,最终建立整个模型。h610.2 需求陈述l需求陈述是阐明“做什么”,而不是“怎样做”l问题范围l功能需求l性能需求l应用环境假设条件h7lATM机系统问题描述l 某银行拟开
3、发一个自动取款机系统,它是由自动取款机ATM、中央计算机、分行计算机及柜员终端组成的网络系统。l 总行投资购买多台ATM和中央计算机,ATM分别设在全市各主要街道上。l 分行提供分行计算机和柜员终端。柜员终端设在分行营业厅及分行下属的各个储蓄所内。该软件的开发成本由各分行分摊。l 储户可以用现金或支票向自己拥有的某个账户内存款、取款或开新账户。通常一个储户拥有多个账户。10.2 需求陈述 举例h8ATM机系统问题描述l 银行柜员使用柜员终端处理储户提交的储蓄事务,柜员负责把储户提交的存款或取款事务输进柜员终端。柜员终端与相应的分行计算机通信,分行计算机具体处理针对某个账户的事务并且维护账户。l
4、 拥有银行账户的储户有权申请领取现金兑换卡,使用现金兑换卡可以通过ATM访问自己的账户。目前仅限于用现金兑换卡在ATM上提取现金或查询自己账户的信息。将来还可能要求使用ATM办理转账、存款等事务。h9ATM机系统问题描述l一张现金兑换卡就是一张特制的磁卡,上面有分行代码。一张磁卡可以访问储户的若干个账户,但仅属于一个储户所有。但是同一张卡可以有多个副本,因此必须考虑同时在若干台ATM上使用同样的现金兑换卡的可能性。l当用户将磁卡插入ATM后,ATM就与用户交互,以获取有关这次事务的信息,并与中央计算机交换关于事务的信息。ATM要求用户输入密码,ATM将密码和卡上的信息传给中央计算机,请求中央计
5、算机核对这些信息并处理这次事务。中央计算机根据卡的分行代码委托分行验证用户密码,若密码正确,则ATM要求用户选择事务类型(取款,查询等)。当用户选择取款时,ATM请求用户输入取款额。最后ATM从现金口吐出现金,并且打印账单给用户。h10l自动取款机(ATM)系统 ATM系统10.2 需求陈述h1110.3 建立对象模型l10.3.1找出候选类与对象l1.找出候选的类与对象l寻找以下五类客观事物l可感知的物理实体l人或组织的角色l应该记忆的事件l两个或多个对象的相互作用,通常具有交易或接触的性质需要说明的概念h1210.3 建立对象模型l10.3.1找出候选类与对象l1.找出候选的类与对象(续)
6、l名词解析法 从陈述中找出所有名词,作为类和对象的初步候选者 银行,自动取款机(ATM),系统,中央计算机,分行计算机,柜员终端,网络,总行,分行,软件,成本,市,街道,营业厅,储蓄所,柜员,储户,现金,支票,账户,事物,现金兑换卡,余额,磁卡,分行代码,卡号,用户,副本,信息,密码,类型,取款额,账单,访问。h13l 某银行拟开发一个自动取款机系统,它是由自动取款机ATM、中央计算机、分行计算机及柜员终端组成的网络系统。l 总行投资购买多台ATM和中央计算机,ATM分别设在全市各主要街道上。l 分行提供分行计算机和柜员终端。柜员终端设在分行营业厅及分行下属的各个储蓄所内。该软件的开发成本由各
7、分行分摊。l 储户可以用现金或支票向自己拥有的某个账户内存款、取款或开新账户。通常一个储户拥有多个账户。从陈述中找出所有名词,作为类和对象的初步候选者h14从陈述中找出所有名词,作为类和对象的初步候选者l 银行柜员使用柜员终端处理储户提交的储蓄事务,柜员负责把储户提交的存款或取款事务输进柜员终端。柜员终端与相应的分行计算机通信,分行计算机具体处理针对某个账户的事务并且维护账户。l 拥有银行账户的储户有权申请领取现金兑换卡,使用现金兑换卡可以通过ATM访问自己的账户。目前仅限于用现金兑换卡在ATM上提取现金或查询自己账户的信息(例如,某个指定账户上的余额)。将来还可能要求使用ATM办理转账、存款
8、等事务。h15l一张现金兑换卡就是一张特制的磁卡,上面有分行代码,对应总行下的一个分行。卡号确定这张卡可以访问哪些账户。一张磁卡可以访问储户的若干个账户,但仅属于一个储户所有。但是同一张卡可以有多个副本,因此必须考虑同时在若干台ATM上使用同样的现金兑换卡的可能性。也就是说,系统应该能够处理并发的访问。l当用户将磁卡插入ATM后,ATM就与用户交互,以获取有关这次事务的信息,并与中央计算机交换关于事务的信息。ATM要求用户输入密码,ATM将密码和卡上的信息传给中央计算机,请求中央计算机核对这些信息并处理这次事务。中央计算机根据卡的分行代码委托分行验证用户密码,若密码正确,则ATM要求用户选择事
9、务类型(取款,查询等)。当用户选择取款时,ATM请求用户输入取款额。最后ATM从现金口吐出现金,并且打印账单给用户。从陈述中找出所有名词,作为类和对象的初步候选者h1610.3 建立对象模型l10.3.1找出候选类与对象l2.筛选出正确的类与对象l筛选时主要依据下列标准,删除不正确或不必要的类与对象!(1)冗余(2)无关(3)笼统(4)属性(5)操作银行,自动取款机(ATM),系统,中央计算机分行计算机,柜员终端,网络,总行,分行,软件,成本,市,街道,营业厅,储蓄所,柜员,储户,现金,支票,账户,事务,现金兑换卡,余额,磁卡,分行代码,卡号,用户,副本,信息,密码,类型,取款额,账单,访问。
10、(共34个名词)从中筛选出正确的类与对象)(储户、用户;现金兑换卡、磁卡和副本)(成本、市、街道、营业厅和储蓄所)(银行、访问、信息、网络、系统、软件)(现金、支票、取款额、账单、余额、分行代码、卡号、密码、类型)注意:在分析阶段不应该过早地考虑怎样实现目标系统。h1710.3.1找出候选类与对象l2.筛选出正确的类与对象(共11个)ATM中央计算机分行计算机柜员终端总行分行柜员储户账户事务(分为柜员事务和远程事务)现金兑换卡h1810.3.2 确定关联l1.初步确定关联 需求陈述中使用的描述性动词或动词词组,通常表示关联关系。(1)直接提取动词短语得出关联(2)需求陈述中隐含的关联(3)根据
11、问题域知识得出的关联 h19直接提取动词短语得出的关联ATM、中央计算机、分行计算机及柜员终端组成网络。总行拥有多台ATM。ATM设在主要街道上。分行提供分行计算机和柜员终端。柜员终端设在分行营业厅及储蓄所内。分行分摊软件开发成本。储户拥有账户。分行计算机处理针对账户的事务。分行计算机维护账户。柜员终端与分行计算机通信。柜员输入针对账户的事务。ATM与中央计算机交换关于事务的信息。中央计算机确定事务与分行的对应关系。ATM读现金兑换卡。ATM与用户交互。ATM吐出现金。ATM打印账单。系统处理并发的访问。隐含的关联总行由各个分行组成。分行保管账户。总行拥有中央计算机。系统维护事务日志。系统提供
12、必要的安全性。储户拥有现金兑换卡。中央计算机与分行通信根据问题域知识得出的关联现金兑换卡访问账户。分行雇用柜员。h2010.3.2 确定关联l2.筛选(1)根据下述标准删除候选关联:已删去的类之间的关联。与问题无关的或在实现阶段考虑的关联。瞬时事件。派生关联。(2)三元关联:将三元关联改造成二元关联。h21直接提取动词短语得出的关联ATM、中央计算机、分行计算机及柜员终端组成网络。总行拥有多台ATM。ATM设在主要街道上。分行提供分行计算机和柜员终端。柜员终端设在分行营业厅及储蓄所内。分行分摊软件开发成本。储户拥有账户。分行计算机处理针对账户的事务。分行计算机维护账户。柜员终端与分行计算机通信
13、。柜员输入针对账户的事务。ATM与中央计算机交换关于事务的信息。中央计算机确定事务与分行的对应关系。ATM读现金兑换卡。ATM与用户交互。ATM吐出现金。ATM打印账单。系统处理并发的访问。隐含的关联总行由各个分行组成。分行保管账户。总行拥有中央计算机。系统维护事务日志。系统提供必要的安全性。储户拥有现金兑换卡。中央计算机与分行通信根据问题域知识得出的关联现金兑换卡访问账户。分行雇用柜员。去掉已删去类的关联去掉与问题无关的或应该在实现阶段考虑的关联去掉瞬时事件将三元关联改造成二元关联去掉派生关联分行计算机处理针对账户的事务。分解为:分行计算机处理事务。事务修改账户。柜员输入针对账户的事务。分解
14、为:柜员输入事务。事务修改账户。ATM与中央计算机交换关于事务的信息。分解为:ATM与中央计算机通信。在ATM机上输入事务。h2210.3.2 确定关联l3.进一步完善正名、分解、补充、标明重数 ATMATM系统原始的类图h23(6)分行提供分行计算机和柜员终端。(7)储户拥有账户。(8)分行计算机维护账户。同2及13-2(9)柜员终端与分行计算机通信。(10)中央计算机确定事务与分行的对应关系。同(5)(13)柜员输入针对账户的事务。分解为:(13-1)柜员输入事务。(13-2)事务修改账户。(14)分行计算机处理针对账户的事务。分解为:(14-1)分行计算机处理事务。(14-2)事务修改账
15、户。(15)ATM与中央计算机交换关于事务的信息。分解为:(15-1)ATM与中央计算机通信。(15-2)在ATM机上输入事务。隐含的关联(1)总行由各个分行组成。(2)分行保管账户。(3)总行拥有中央计算机。(4)储户拥有现金兑换卡。(5)中央计算机与分行通信根据问题域知识得出的关联(11)现金兑换卡访问账户。(12)分行雇用柜员。直接提取动词短语得出的关联h24隐含的关联(1)总行由各个分行组成。(2)分行保管账户。(3)总行拥有中央计算机。(4)储户拥有现金兑换卡。(5)中央计算机与分行通信(6)分行提供分行计算机和柜员终端。(7)储户拥有账户。(8)分行计算机维护账户。同2及13-2(
16、9)柜员终端与分行计算机通信。(10)中央计算机确定事务与分行的对应关系。同(5)(13)柜员输入针对账户的事务。分解为:(13-1)柜员输入事务。(13-2)事务修改账户。(14)分行计算机处理针对账户的事务。分解为:(14-1)分行计算机处理事务。(14-2)事务修改账户。(15)ATM与中央计算机交换关于事务的信息。分解为:(15-1)ATM与中央计算机通信。(15-2)在ATM机上输入事务。根据问题域知识得出的关联(11)现金兑换卡访问账户。(12)分行雇用柜员。h2510.3.3 划分主题l在概念上把系统包含的内容分解成若干个范畴应该按问题领域而不是用功能分解的方法来确定主题不同主题
17、内的对象相互间依赖和交互最少的原则 总行(总行和中央计算机)ATM系统 分行(分行、分行计算机、柜员终端、柜员 事务、柜员和账户等)ATM(ATM、远程事务、现金兑换卡和储户)h2610.3.4 确定属性l属性是对象的性质或特征l注意在分析阶段不要用属性来表示对象间的关系,使用关联能够表示两个对象间的任何关系,而且把关系表示得更清晰、更醒目。h2710.3.4 确定属性l选择在需求陈述中一般用名词词组表示属性需藉助于领域知识和常识才能分析得出属性属性对问题域的基本结构影响很小属性的确定与问题域和目标系统的任务有关。不要考虑那些超出所要解决的问题范围的属性。先找最重要的属性,再逐渐把其余属性增添
18、进去。分析阶段不考虑那些纯粹用于实现的属性。h28经过筛选之后,得到ATM系统中各个类的属性,如图所示。10.3.4 确定属性建立类间的继承是为了共享其公共性质/属性。继承也对类按层次加以组织。继承关系反映出一定深度的领域知识,需领域专家密切配合才能完成。继承前人的成果是提高效率的重要方法,也是复用的基础。10.3.5 识别继承关系两种建立继承(即泛化)关系的方式:(1)自底向上:抽象出现有类的共同性质泛化出父类,这个过程实质上模拟了人类归纳思维过程。例如,在ATM系统中,“远程事务”和“柜员事务”是类似的,可以泛化出父类“事务”;类似地,从“ATM”和“柜员终端”泛化出父类“输入站”。(2)
19、自顶向下:把现有类细化成更具体的子类或从已知类派生出一个新类,这模拟了人类的演绎思维过程:从一般到特殊。带有形容词修饰的名词词组往往暗示了一些具体类。分析阶段应该避免过度细化。增加了继承关系之后的ATM对象模型一次建模过程很难得到完全正确的对象模型。有些细化工作(例如,定义服务)是在建立了动态模型和功能模型之后才进行的。由于面向对象的概念和符号在整个开发过程中都是一致的,因此远比使用结构分析、设计技术更容易实现反复修改、逐步完善的过程。建模的步骤并不一定按照前面讲述的次序进行。它给初学者提供了一个指南。下面以ATM系统为例,讨论可能做的修改:10.3.6 反复修改1.分解“现金兑换卡”类“现金
20、兑换卡”有两个相对独立的功能,它既是鉴别储户及使用ATM的权限的卡,又是ATM获得分行代码和卡号等数据的数据载体。因此,把“现金兑换卡”类分解为“卡权限”和“现金兑换卡”两个类,将使每个类的功能更单一:前一个类标志储户访问账户的权限,后一个类是含有分行代码和卡号的数据载体。多张现金兑换卡可能对应着相同的访问权限。2.“事务”由“更新”组成一个事务可包含对账户的若干次更新。更新指的是对账户所做的一个动作(取款、存款或查询)。“更新”有自己的属性(类型、金额等),应该独立存在,因此应该把它作为类。3.把“分行”与“分行计算机”合并区分“分行”与“分行计算机”,对于分析这个系统来说,并没有多大意义,
21、为简单起见,把它们合并。类似地,应该合并“总行”和“中央计算机”。下图给出了修改后的ATM对象模型,与修改前比较起来,它更简单、更清晰。1、分解“现金兑换卡”类为“卡权限”和“现金兑换卡”两个类;2、“事务”由“更新”组成;3、把“分行”与“分行计算机”合并修改后的ATM对象模型对于仅存储静态数据的系统(例如数据库)来说,动态模型并没有什么意义。但是若开发交互式系统时,动态模型却起着很重要的作用。例如:收集输入信息是目标系统的主要工作。10.4 建立动态模型的方法10.4 建立动态模型遗漏常见的交互行为。建立动态模型的三步:l 编写典型交互行为的脚本,包括正常情况和异常情况脚本。l从脚本中提取
22、出事件,确定触发每个事件的动作对象以及接受事件的目标对象。l排列事件发生的次序,确定每个对象可能有的状态及状态间的转换关系,并用状态图描绘它们。最后,比较各个对象的状态图,检查它们之间的一致性,确保事件之间的匹配。脚本:是指系统在某一执行期间内出现的一系列事件。编写脚本的目的:是保证不遗漏重要的交互步骤,有助于确保整个交互过程的正确性的和清晰性。编写脚本内容:描写既可以包括系统中发生的全部事件,也可以只包括由某些特定对象触发的事件。对于每个事件,都应该指明触发该事件的动作对象(系统、用户或其他事物)、接受事件的目标对象以及该事件的参数。编写步骤:l编写正常情况的脚本。l考虑特殊情况,例如输入或
23、输出的数据为最大值(或最小值)。l考虑出错情况,例如,输入的值为非法值或响应失败。10.4.1 编写脚本ATM系统正常和异常脚本l事件跟踪图有助于画状态图。l它把事件序列以及事件与对象的关系,形象、清晰地表示出来。事件跟踪图实质上是扩充的脚本,是简化的UML顺序图。l在事件跟踪图中,一条竖线代表一个对象,每个事件用一条水平的箭头线表示,箭头方向从事件的发送对象指向接受对象。时间从上向下递增。10.4.3 画事件跟踪图ATM系统正常情况下的事件跟踪图时间对象事件/消息l 一张状态图描绘一类对象的行为,它确定了由事件序列引出的状态序列。l从竖线射出的箭头线,常是对象达到某个状态时所做的行为(也常是
24、引起另一类对象状态转换的事件)。l两个事件之间的间隔就是一个状态(也可能不变)。10.4.4 画状态图l 考虑完正常事件之后再考虑边界情况和特殊情况.如,用户要求取消该当前事务,“超时”,停电/机。不能省略对用户出错情况的处理。l一张覆盖了脚本中某类对象的全部事件的状态图仍可能会一些遗漏的情况。l 尽量给每个状态取个有意义的名字。10.4.4 画状态图以ATM系统为例:l“ATM”、“柜员终端”、“总行”和“分行”都是主动对象,它们相互发送事件;l“现金兑换卡”、“事务”和“账户”是被动对象,并不发送事件。l“储户”和“柜员”虽然也是动作对象,但是,它们都是系统外部的因素,无须在系统内实现它们
25、。ATM的状态图图10.10 总行类验证账户的状态图图10.11 分行类验证密码的状态图总行类分行类图10.10 总行类的处理事务状态图图10.11 分行类的处理事务状态图总行类分行类l 各个类的状态图通过共享事件联系(合并)起来,构成了系统的动态模型。l 应该检查系统级的完整性和一致性。l 对于没有前驱或没有后继的状态应该着重审查,如果这个状态既不是交互序列的起点也不是终点,则发现了一个错误。10.4.5 审查动态模型l 应该审查每个事件,跟踪它对系统中各个对象所产生的效果,以保证它们与每个脚本都匹配。例:ATM系统在总行类的状态图中,事件“无效代码”,是由总行发出的,但是在ATM类的状态图
26、中并没有一个状态接受这个事件。因此,在ATM类的状态图中应该再补充一个状态“do/显示分行代码错信息”,它接受由前驱状态“do/验证账户”发出的事件“无效代码”,它的后续状态是“退卡”。10.4.5 审查动态模型ATM的状态图do/显示分行代码错信息无效代码无效代码在确定类中应有的服务时,既要考虑该类实体的常规行为,又要考虑在本系统中特殊需要的服务。1.常规行为在分析阶段可以认为,类中定义的每个属性都是可以访问的,也就是说,假设在每个类中都定义了读、写该类每个属性的操作。但是,通常无需在类图中显式表示这些常规操作。10.6 定义服务2.从事件导出的操作!状态图中对象接收消息,因此该对象必须有由
27、消息选择符指定的操作,它启动相应的服务。在ATM系统中,总行类的“处理分行事务”启动分行对象的服务“更新账户”。所启动的服务常是接受事件的对象在相应状态的行为。(如:图10.11分行状态图的左图)从图10.9ATM的状态图可导出的ATM类的操作有:显示主屏(),要求密码(),验证账户(),要求类型();要求金额(),处理事务(),吐出现金及请求拿走现金().。从图10.10总行的状态图可导出的总行类的操作有:请求处理分行事务(),验证分行代码(),请求分行验卡()从图10.11分行的状态图可导出分行类的操作有:更新账户(),验证卡号(),验证密码()4.利用继承减少冗余操作应该尽量利用继承机制
28、以减少所需定义的服务数目。只要不违背领域知识和常识,就尽量抽取出相似类的公共属性和操作,以建立这些类的新父类,并在类等级的不同层次中正确地定义各个服务。l分析就是提取系统需求并建立问题域精确模型的过程。l面向对象分析的关键工作,是分析、确定问题域中的对象及对象间的关系,并建立起问题域的对象模型、功能模型和动态模型。l大型、复杂系统的对象模型通常由下述5个层次组成:主题层、类与对象层、结构层、属性层和服务层。它们对应着在建立对象模型的过程中所应完成的5项工作。10.7 小结l课后作业:lP256 第1题课堂练习某电话公司决定开发一个管理所有客户信息的交互式网络系统,系统的功能如下:(1)浏览客户
29、信息:任何使用Internet的网络用户都可以浏览电话公司所有的客户信息(包括姓名、住址、电话号码等)。(2)登录:电话公司授予每个客户一个账户。拥有授权账户的客户,可以使用系统提供的页面设置个人密码,并使用该账户和密码在系统注册。(3)修改个人信息:客户在系统注册后,可以发送电子邮件或使用系统提供的页面对个人信息进行修改。(4)删除客户信息:只有公司的管理人员才能删除不再受公司服务的客户信息。系统采用面向对象的方法进行开发,请画出用例图和类图。用例图建立对象模型(类图)的五个层次 复杂问题的对象模型的5个层次五个层次像是对象模型的5张水平切片,一层比一层显示出对象模型的更多细节。类或对象间的
30、关系指读者理解大型、复杂模型的一种机制,将一个大型的、复杂的对象模型分解成几个不同的概念范畴(记忆的7+2原则)下列五类客观事物可作为候选对象:可感知的物理实体人或组织的角色应该记忆的事件两个或多个对象的相互作用,通常具有交易或接触的性质需要说明的概念第1步:采用名词解析法获取候选的类(1)浏览客户信息:任何使用Internet的网络用户都可以浏览电话公司 所有的客户信息(包括姓名、住址、电话号码等)。(2)登录:电话公司授予每个客户一个账户。拥有授权账户的客户,可以使用系统提供的页面设置个人密码,并使用该账户和密码在系统注册。(3)修改个人信息:客户在系统注册后,可以发送电子邮件或使用系统提
31、供的页面对个人信息进行修改。(4)删除客户信息:只有公司的管理人员才能删除不再受公司服务的客户信息。候选的类如下:(1)浏览客户信息:任何使用Internet的网络用户都可以浏览电话公司 所有的客户信息(包括姓名、住址、电话号码等)。(2)登录:电话公司授予每个客户一个账户。拥有授权账户的客户,可以使用系统提供的页面设置个人密码,并使用该账户和密码在系统注册。(3)修改个人信息:客户在系统注册后,可以发送电子邮件或使用系统提供的页面对个人信息进行修改。(4)删除客户信息:只有公司的管理人员才能删除不再受公司服务的客户信息。(1)客户信息、Internet、网络用户、电话公司、所有的客户信息、姓
32、名、住址、电话号码(2)客户、账号、系统、页面、个人密码(3)个人信息、电子邮件、系统(4)管理人员、信息(1)客户信息,Internet,网络用户,电话公司所有的客户信息,姓名,住址,电话号码(2)登录,客户,账户,系统,页面,个人密码(3)个人信息,电子邮件(4)公司,管理人员第2步:筛选出有用的类(1)客户信息,Internet,网络用户,电话公司所有的客户信息,姓名,住址,电话号码(2)登录,客户,账户,系统,页面,个人密码(3)个人信息,电子邮件(4)公司,管理人员筛选依据:(1)冗余:客户信息与个人信息(2)无关:电话公司(3)笼统:系统、页面、公司、Internet(4)属性:姓名、住址、电话号码、账户、个人密码、电子邮件(5)操作:登录第2步:筛选出有用的类,共去掉13个候选类,剩下5个类:(1)客户信息,网络用户,所有的客户信息(2)客户(3)(4)管理人员类的详细描述:描述类名网络用户internetClient公司客户CompanyCustomer公司的管理人员InternalManager客户信息(记录公司单个客户信息)Customer客户信息表(记录公司所有客户信息)CustomerList第3 步:获取并补充隐含的关联l每个客户对应着相应的客户信息l客户信息表由客户信息组成l网络用户浏览客户信息表l公司管理员和公司客户是网络用户第4步:画类图