第11章面向对象设计11.1面向对象设计的准则1.模块化面向对象的软件开发模式,支持了系统模块化的原则:对象就是模块。它把数据结构和操作(方法)紧密地结合在一起构成模块。2.抽象类实际上是一种抽象数据类型,它对外开放的公共接口构成了类的规格说明(协议),这种接口规定了外界可以使用的合法操作符,利用这些操作符可以对类的实例中包含的数据进行操作。3.信息隐蔽在面向对象方法中,信息隐蔽通过对象的封装性实现:类结构分离了类的接口与类的实现,从而支持了信息隐蔽。4.弱耦合弱的耦合可以提高软件模块的独立性,避免某一部分模块发生变化对其它模块有较大的影响。一般来说,对象间的耦合有两大类:A.交互耦合:对象间的耦合通过信息连接来实现。应使交互耦合尽量松散。B.继承偶合:与交互耦合相反,应该提高继承耦合的程度。因为通过继承关系结合起来的基类和派生类,结合得越紧密越好。5.强内聚面向对象设计中存在三种内聚:A.服务内聚:一个服务应该完成一个且完成一个功能。B.类内聚:一个类应该只有一个用途,它的属性和服务应该是高内聚的。C.一般—特殊内聚:即基类—派生类的内聚。6.可重用使用已经存在的类(包括开发环境提供的类库,及以往开发相似系统时创建的类),可以提高软件重用性,提高软件生产率。人们在面向对象方法中也积累了一些经验,总结出几条启发规则:1.设计结果应该清晰易懂;1)用词一致;2)使用已有的协议;3)减少消息模式的数目;4)避免模糊的定义。11.2启发规则2.一般—特殊结构的深度应适当:中等规模的系统中,类等级层次数应保持为7±2。不是必要情况,不应该随意创建派生类;3.设计简单的类:设计小而简单的类,便于开发和管理;1)避免包含过多的属性;2)有明确的定义;3)尽量简化对象之间的合作关系;4)不要提供太多服务。4.使用简单的协议:设计简单的类接口,发送的消息中参数要少。5.使用简单的服务:编写实现每一个服务时,避免复杂的语句和结构;6.把设计变动减至最小。11.3软件重用11.3.1概述1.重用重用的三个层次:1)知识重用;2)方法和标准的重用;3)软件成分的重用。2.软件成分的重用级别:1)代码重用a.源代码剪贴;b.源代码包含;c.继承;2)设计结果重用3)分析结果重用3.典型的可重用软件成分1)项目计划;2)成本计划;3)体系结构;4)需求模型和规格说明;5)设计;6)源代码;7)用户文档和技术文档;8)用户界面;9)数据;10)测试用例。11.4系统分解类与对象层人机交互部分问题域部分任务管理部分数据管理部分主题层结构层属性层服务层图11.2典型的面向对象设计模型11.5设计问题域子系统在设计问题域部分时,仅需要从实现的角度对问题域模型(对象模型、动态模型、功能模型)作一些补充、修改,主要是增添、合并或分解类与对象、属性和服务,调整继承关系等。1.调整需求2.重用已有的类3.组合问题域的类4.增添基类以定义公共函数集合5.调整继承层次1)使用多重继承机制2)使用单继承机制6.ATM系统实例11.6设计人机交互子系统在面向对象分析中,已经对用户界面需求作了初步分析,在面向对象设计过程中,要对系统人机交互部分进行详细设计,其中包括指定窗口和报表的形式、设计命令层次等等。设计人机交互子系统的策略:1)分类用户;2)描述用户;3)设计命令层次;4)设计人机交互类。11.7设计任务管理子系统任务可视作进程(Process)1.分析并发性基于动态模型分析并发性,如果对象间不存在交互,或不同时接受事件,则是并发的。并发任务可以在不同的处理器上实现,也可以在单个处理器上利用多任务操作系统实现。2.设计任务管理子系统1)确定事件驱动型任务:主要完成通信工作工作过程:睡眠等待来自数据线的中断任务唤醒、接收数据通知相应对象继续睡眠2)确定时钟驱动型任务每隔一定时间触发执行某些任务。3)确定优先任务4)确定关键任务5)确定协调任务当同时运行的任务较多时(3个以上),一般设计协调任务,会增加系统开销,但有利于封装不同任务间的协调控制。6)尽量减少任务数7)确定资源需求计算系统载荷(单位时间处理业务数),估算所需CPU性能。11.8设计数据管理子系统11.8.1选择数据存储管理模式1.文件管理系统2.关系数据库管理系统3.面向对象数据库管理系统11.8.2设计数据管理子系统1.设计数据格式2.设计相应的服务11.8.3ATM系统实例采用成熟的商品化关系数据库。根据数据库范式设计,保持数据一致性、完整性。处理并发事务时,每个事务作为一个不可分割的批操作来处理,由事务封锁帐户,直至事务结束。11.9设计类中的服务11.9.1确定类中应有的服务11.9.2设计实现服务的方法1.设计实现服务的算法1)算法复杂度;2)容易理解、容易实现;3)容易修改;2.选择数据结构3.定义内部类和内部操作第12章面向对象实现12.1.1面向对象语言的优点使用面向对象语言时,编译程序可以自动把面向对象概念映射到目标程序中。使用非面向对象语言编写面向对象程序,则必须由程序员自己把面向对象概念映射到程序中。1980年的smalltalk-80发展了Simula-67的对象和类的概念,并引入了方法、消息、元类及协议等概念,所以有人将smalltalk80称为第一个面向对象语言。但是,使面向对象广泛流行的是C++。12.1.2面向对象语言的技术特点选择面向对象语言时应考虑的技术特点:1.支持类与对象概念的机制2.实现整体-部分(聚集)结构的机制3.实现一般-特殊(泛化)结构的机制4.实现属性和服务的机制5.类型检查6.类库7.效率8.持久保存对象9.参数化类10.开发环境12.1.3选择面向对象语言1.将来能否占主导地位2.可重用性3.类库和开发环境4.其他因素有否提供技术支持?提供开发人员什么开发平台?对及其性能的需求?集成已有软件的容易程度。12.2程序设计风格12.2.1提高可重用性12.2.2提高可扩充性12.2.3提高健壮性12.3测试策略12.3.1面向对象的单元测试基类:操作A:X子类:操作A1:XA2:XA3:X有必要在每个子类中测试操作X不孤立地测试单个操作(函数),而是把操作作为类的一部分进行测试。12.3.2面向对象的集成测试两种不同的测试策略:1)基于线程的测试(threadbasedtesting)将响应系统的一个输入或一个事件所需要的哪些类集成起来测试。2)基于使用的测试(usebasedtesting)先测试独立类,再测试使用独立类的下一层次的类(依赖类),重复直至完毕。12.3.3面向对象的确认测试主要是根据动态模型和描述系统行为的脚本来设计确认测试用例。12.4设计测试用例12.4.1测试类的方法1.随机测试ATM系统中account(帐户)类的操作有:Open(打开)、Setup(建立)、Deposit(存款)、Withdraw(取款)、Balance(余额)、Summarize(清单)、CreditLimit(透支限额)、Close(关闭)。可以随机地产生一系列不同的操作序列:测试用例1:Open.Setup.Deposit.Balance.Summarize.Withdraw.Close测试用例2:Open.Setup.Withdraw.Deposit.Balance.CreditLimit.Close2.划分测试(类似于等价类划分)1)基于状态的划分改变Account类状态的操作:deposit,withdraw;不改变Account类状态的操作:balance,summarize,creditLimit测试用例:1.open.setup.deposit.deposit.withdraw.withdraw.close;2.open.setup.balance.summarize.creditLimit.close;2)基于属性的划分根据类操作使用的属性来划分操作。例,按属性Balance分可三类:使用Balance的操作;不使用Balance的操作;不使用也不修改balance的操作。3)基于功能的划分依据类操作完成的功能来划分类操作。例,初始化操作:open,setup计算操作:deposit,withdraw查询操作:balance,summarize,creditLimit3.基于故障的测试一般依靠经验和直觉,类似于错误推测测试法。12.4.2集成测试方法测试类协作可以使用随机测试方法、划分测试方法、行为测试等。1.多类测试2.从动态模型导出测试用例EmptyacctsetupacctworkingacctnonworkingacctdeadacctopenSetupacctDeposit(initial)closeWithdraw(final)depositwithdrawBalanceCreditAcctInfoAccount类的状态转换图应使Account类实例遍历所有允许的状态转换:测试用例1:open.setupacct.deposit(initial).withdraw(final).Close测试用例2:open.setupacct.deposit(initial).deposit.blance.credit.withdraw(final).Close测试用例3:open.setupacct.deposit(initial).deposit.withdraw.AcctInfo.withdraw(final).Close……第13章:软件评价与管理ANSI/IEEEStd729-1983定义的“软件质量”为:与软件产品满足规定的和隐含的需求的能力有关的特征或特性的全体。M.J.Fisher定义的“软件质量”为:所有描述计算机软件优秀程度的特性的组合。13.1软件质量在计算机发展早期,计算机内存容量有限,运行速度慢,人们设计软件时特别强调时间、空间效率。现今对软件质量已经开始形成较全面的评价。13.1.1软件质量标准一般说来,应从三个方面考虑软件质量:1)功能与性能方面软件应该能够按照既定的要求进行工作,与明确规定的功能和性能需求一致。软件要保证能够可靠的工作,合法的输入下正确运行,非法输入和意外事件可安全处理。2)软件结构方面软件应该具备良好的结构:1)要求系统内部结构清晰,易于软件人员阅读和理解,方便对软件的修改和维护;2)要求系统具备良好的人机交互界面,方便用户使用。与明确规定的功能和性能要求相比,这些需求是隐含的,也是“软件质量”概念中所定义的。3)开发标准与文档方面软件开发应该与明确成文的开发标准相一致,而且要遵循一些软件开发准则,软件文档资料也必须齐全。以上三方面是相辅相成的,但还必须指出:A.不同的人对软件质量的要求不同。用户要求软件使用方便,执行效率高;而维护人员要求软件文档资料清晰、完整。B.不同的软件系统,它的关键特性有所不同。例如,可移植性是某类软件系统的重要特性,而对于另外一些系统却不是最重要的。C.质量的不同特性之间可能是矛盾的。例如,片面强调软件执行效率,设计出来的软件就可能结构复杂;追求良好的可靠性,就不一定能获得较高的运行速度。大型软件系统的质量应该从可靠性、易理解性、易维护性和效率等几个方面评价。具体开发时应使诸多的质量特性最大限度地满足。软件质量保证(SQA)主要做好几方面:1)应用技术手段软件质量保证活动开始于帮助分析员获得高质量的规格说明书,帮助设计员应用高效的技术方法和工具,并且始终贯穿整个开发过程。13.1.2软件质量保证2)组织技术评审在软件开发过程的每个阶段结束后,都需要组织技术评审,可以及早发现软件开发过程中可能引起的潜在错误,并对质量进行评价。3)加强软件测试软件测试是软件质量保证的重要手段,可以发现软件中大多数隐蔽的错误。4)推行软件工程标准标准是由用户或委托单位确定的,有时是设计者自定的。一旦标准确定,就应该重视标准,并在软件开发中统一遵循。因此,可以将软件规范情况作为软件技术评审的一项内容。5)控制软件变更软件质量的一个主要威胁来自于对软件的修改和变更。在修改