1、2022-3-22上海大学计算机学院1软件工程学概述软件工程学概述可行性分析与需求分析可行性分析与需求分析总体设计总体设计详细设计详细设计实现实现维护维护面向对象方法学引论面向对象方法学引论面向对象分析面向对象分析面向对象设计面向对象设计复习复习 2022-3-22上海大学计算机学院2软件工程学概述软件工程学概述软件危机软件危机定义:定义:指在计算机软件的开发和维护过程中所遇到的一系列严重问题。典型表现:典型表现:开发成本和进度的估计常常很不准确;用户对“已完成的”软件系统不满意; “闭门造车”; 软件质量不可靠;软件常常是不可维护的;软件成本的比例逐年上升;软件产品“供不应求”;产生软件危机
2、的原因产生软件危机的原因软件的规模加大、复杂性提高、性能增强;软件是逻辑产品, 尚未完全认识其本质和特点; 缺乏系统的开发、维护大型软件项目的技术手段和管理方法;用户和软件开发人员的理解鸿沟;错误的认识和作法2022-3-22上海大学计算机学院3软件工程学概述软件工程学概述 软件工程软件工程 定义定义 软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它。 本质特性本质特性 软件工程的中心课题是控制复杂性 和谐地合作是开发软件的关键
3、2022-3-22上海大学计算机学院4软件工程学概述软件工程学概述软件工程的软件工程的7条条基本原理基本原理1.用分阶段的生命周期计划严格管理用分阶段的生命周期计划严格管理2.坚持进行阶段评审坚持进行阶段评审3.实行严格的产品控制实行严格的产品控制4.采用现代程序设计技术采用现代程序设计技术5.结果应能清楚地审查结果应能清楚地审查6.开发小组的人员应该少而精开发小组的人员应该少而精7.承认不断改进软件工程实践的必要性承认不断改进软件工程实践的必要性2022-3-22上海大学计算机学院5软件工程学概述软件工程学概述软件生命周期是软件产品或系统一系列相关活动的全周软件生命周期是软件产品或系统一系列
4、相关活动的全周期。期。软件生命周期的软件生命周期的3个大阶段个大阶段1. 软件定义软件定义: 确定软件开发总目标;确定工程的可行性;导出实现策略确定软件开发总目标;确定工程的可行性;导出实现策略及系统功能;估计资源和成本,并且制定工程进度表。及系统功能;估计资源和成本,并且制定工程进度表。 问题定义、可行性研究、需求分析2. 软件开发软件开发: 具体设计和实现在前一个时期定义的软件具体设计和实现在前一个时期定义的软件 总体设计、详细设计、编码和单元测试、综合测试3. 软件维护软件维护: 使软件持久地满足用户的需要使软件持久地满足用户的需要2022-3-22上海大学计算机学院6软件工程学概述软件
5、工程学概述 生命周期中各阶段的任务生命周期中各阶段的任务1. 问题定义:问题定义: “要解决的问题是什么要解决的问题是什么?”; 确定用户要求解决的性质、工确定用户要求解决的性质、工程的目标和规模。程的目标和规模。2. 可行性研究:可行性研究: “对于上一个阶段所确定的问题有行得通的解决办法吗对于上一个阶段所确定的问题有行得通的解决办法吗?”, 经济可行性、技术可行性、法律可行性、不同的方案经济可行性、技术可行性、法律可行性、不同的方案3. 需求分析:需求分析: “为了解决这个问题,目标系统必须做什么为了解决这个问题,目标系统必须做什么”, 确定系统确定系统必须具有的功能和性能,系统要求的运行
6、环境,并且预测系统发展的前必须具有的功能和性能,系统要求的运行环境,并且预测系统发展的前景。景。4. 总体设计(概要设计)总体设计(概要设计): “概括地说,应该怎样实现目标系统概括地说,应该怎样实现目标系统?”; 设设计出实现目标系统的几种可能的方案。推荐一个最佳方案。计出实现目标系统的几种可能的方案。推荐一个最佳方案。5. 详细设计:详细设计: “应该怎样具体地实现这个系统呢应该怎样具体地实现这个系统呢?”; 设计出程序的详细设计出程序的详细规格说明。规格说明。6. 编码和单元测试:编码和单元测试: 写出正确的容易理解、容易维护的程序模块;写出正确的容易理解、容易维护的程序模块; 仔细仔细
7、测试编写出的每一个模块。测试编写出的每一个模块。7. 综合测试:综合测试: 集成测试和验收测试,现场测试或平行运行集成测试和验收测试,现场测试或平行运行8. 软件维护:软件维护: 使系统持久地满足用户的需要。包括:使系统持久地满足用户的需要。包括: 改正性维护,适应性改正性维护,适应性维护,完善性维护,预防性维护。维护,完善性维护,预防性维护。2022-3-22上海大学计算机学院7软件工程学概述软件工程学概述生命周期模型规定了把生命周期模型规定了把生命周期划分成哪些阶段生命周期划分成哪些阶段及及各个各个阶段的执行顺序阶段的执行顺序,因此,也称为过程模型。,因此,也称为过程模型。u典型的过程模型
8、典型的过程模型1. 瀑布模型瀑布模型(Waterfall model)2. 快速原型开发模型快速原型开发模型(Rapid Prototyping model)3. 增量模型增量模型(Incremental model)4. 螺旋模型螺旋模型(Spiral model)5. 喷泉模型喷泉模型6. 其它模型其它模型 极限编程XP(eXtreme Programming) RUP(Rational Unified Process) 建造修补模型(Build-and-fix model) 2022-3-22上海大学计算机学院8软件工程学概述软件工程学概述 瀑布模型瀑布模型特点特点1. 阶段间具有顺序性
9、和依赖性2. 推迟实现的观点清楚地区分逻辑设计与物理设计,尽可能推迟程序的物理实现。3. 质量保证的观点(文档驱动)每个阶段都必须完成规定的文档每个阶段结束前都要对所完成的文档进行评审缺点缺点1. 开发过程一般不能逆转,否则代价太大。2. 规格说明很难理解:“我知道这是按我的要求做的,但不是我想要的样子。”3. 软件的实际情况必须到项目开发的后期客户才能看到。2022-3-22上海大学计算机学院9软件工程学概述软件工程学概述增量模型增量模型 把软件产品作为一系列增量构件来把软件产品作为一系列增量构件来设计、编码、集成和测试。设计、编码、集成和测试。 优点优点 每个阶段交付一个可用的产品。 减少
10、一个全新产品给客户带来的心理上的影响。 分阶段地交付产品不需要大的资金支出。 需求经常变化,增量模型的灵活性使其具有更加优越的适用性。 缺点缺点 需要一个开放的结构,方便构件的加入。2022-3-22上海大学计算机学院10软件工程学概述软件工程学概述生命周期模型优点缺点瀑布模型瀑布模型文档驱动的有序方法文档驱动的有序方法交付产品可能不符合客户交付产品可能不符合客户的要求的要求快速原型模型快速原型模型确保交付的产品符合客户的要求确保交付的产品符合客户的要求还没有证明无懈可击还没有证明无懈可击增量模型增量模型增大投资的早期回报增大投资的早期回报要求开放的结构,可能退要求开放的结构,可能退化为建造化
11、为建造-修补模型修补模型螺旋模型螺旋模型结合上述所有模型的特性结合上述所有模型的特性只能用于大型的内部软件只能用于大型的内部软件产品,开发者必须精通风产品,开发者必须精通风险分析和风险排除险分析和风险排除2022-3-22上海大学计算机学院11可行性分析与需求分析可行性分析与需求分析 需求分析的需求分析的任务任务1.准确地回答准确地回答“系统必须做什么系统必须做什么?”2.“分析软件需求和书写软件需求规格说明书分析软件需求和书写软件需求规格说明书” 软件需求软件需求 用户解决问题或达到目标所需要的条件或能力;用户解决问题或达到目标所需要的条件或能力; 系统或系统部件要满足合同、标准、规范或其他
12、正式规定文档所需具系统或系统部件要满足合同、标准、规范或其他正式规定文档所需具有的条件或能力有的条件或能力 反映上述两个定义中所描述的条件或能力的文档说明反映上述两个定义中所描述的条件或能力的文档说明 需求层次:业务需求需求层次:业务需求用户需求用户需求功能与非功能需求功能与非功能需求 具体任务具体任务 确定对系统的确定对系统的综合要求综合要求功能需求、性能需求、可靠性和可用性需求功能需求、性能需求、可靠性和可用性需求、出错处理需求、接口需求、约束、逆向、出错处理需求、接口需求、约束、逆向需求、扩展需求需求、扩展需求 分析系统的分析系统的数据要求数据要求 导出系统的导出系统的逻辑模型逻辑模型
13、书写书写软件需求规格说明书软件需求规格说明书 修正系统开发计划修正系统开发计划2022-3-22上海大学计算机学院12需求分析需求分析数据流图数据流图数据流图(数据流图(DFD)符号)符号数据源点数据源点/数据终点数据终点数据流数据流数据存储数据存储加工加工/处理处理根据描述画数据流图根据描述画数据流图2022-3-22上海大学计算机学院13总体设计总体设计 总体设计的任务总体设计的任务1.1. “概括地说,系统应该如何实现?概括地说,系统应该如何实现?”2.2. 系统划分系统划分: :即确定组成系统的即确定组成系统的程序、文件、数据库、人工过程和文程序、文件、数据库、人工过程和文档等档等3.
14、3. 设计软件的结构:即确定每个程序是由哪些模块组成,以及这设计软件的结构:即确定每个程序是由哪些模块组成,以及这些模块相互间的关系。些模块相互间的关系。2022-3-22上海大学计算机学院14总体设计总体设计 设计原理设计原理1.模块化模块化模块化的根据C C(P1P1P2P2) C C(P1P1) C C(P2P2) E E(P1P1P2P2) E E(P1P1) E E(P2P2)2.抽象抽象抽象就是抽出事物的本质特性而暂不考虑它们的细节3.3. 逐步求精逐步求精为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。4.信息隐藏和局部化信息隐藏和局部化信息隐藏原理:应该这样设计和确定模块
15、,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。局部化: 把一些关系密切的软件元素物理地放得彼此靠近。5.模块独立模块独立每个模块完成一个相对独立的子功能,并且与其它模块间的接口简单。模块独立性的衡量标准模块内聚(Cohension) :模块内各元素交互的程度模块耦合(Coupling) :模块间交互程度2022-3-22上海大学计算机学院15总体设计总体设计各种耦合的含义各种耦合的含义设计时力争做到低耦合。应该采取的设计原则是:尽量设计时力争做到低耦合。应该采取的设计原则是:尽量使用数据耦合,少用控制耦合和特征耦合,限制公用耦使用数据耦合,少用控制耦合和特
16、征耦合,限制公用耦合的范围,完全不用内容耦合。合的范围,完全不用内容耦合。耦耦合合程程度度高高低低 耦合耦合1. 内容耦合内容耦合2. 共用耦合共用耦合3. 控制耦合控制耦合4. 印记(特征)耦合印记(特征)耦合5. 数据耦合数据耦合2022-3-22上海大学计算机学院16总体设计总体设计各种内聚的含义各种内聚的含义设计时力争做到高内聚,并且能够辨认出低内聚设计时力争做到高内聚,并且能够辨认出低内聚的模块,通过修改设计提高模块的内聚程度。的模块,通过修改设计提高模块的内聚程度。内内聚聚程程度度低低高高 内聚内聚1. 偶然性内聚偶然性内聚2. 逻辑性内聚逻辑性内聚3. 时间性内聚时间性内聚4.
17、过程性内聚过程性内聚5. 通信性内聚通信性内聚6. 顺序内聚顺序内聚7. 功能性内聚功能性内聚8. 信息性内聚信息性内聚2022-3-22上海大学计算机学院17总体设计总体设计 启发规则启发规则1. 改进软件结构提高模块独立性改进软件结构提高模块独立性2. 模块规模应该适中模块规模应该适中3. 深度、宽度、扇出和扇入都应适当深度、宽度、扇出和扇入都应适当4. 模块的作用域应该在控制域之内模块的作用域应该在控制域之内 模块的作用域:受该模块内一个判定影响的所有模块的集合。 模块的控制域:模块本身以及所有直接或间接从属于它的模块的集合。 所有受判定影响的模块应该都从属于做出判定的那个模块,最好局限
18、于做出判定的那个模块本身及它的直属下级模块。5. 力争降低模块接口的复杂程度力争降低模块接口的复杂程度6. 设计单入口单出口的模块设计单入口单出口的模块7. 模块功能应该可以预测模块功能应该可以预测2022-3-22上海大学计算机学院18总体设计总体设计模块的判定作用范围模块的判定作用范围(a) 差的结构图;差的结构图; (b) 不理想的结构图;不理想的结构图; (c) 理想的结构图理想的结构图TOPABCDEF(b)TOPABCDEF(a)TOPABCDEF(c)2022-3-22上海大学计算机学院19总体设计总体设计结构图结构图描述软件系统的模块层次结构,清楚地反映出程序中各模块之间描述软
19、件系统的模块层次结构,清楚地反映出程序中各模块之间的的调用关系调用关系和数据传递。和数据传递。AB输入输入数据数据输出输出数据数据调用模块调用模块被调用模块被调用模块选择调用选择调用循环调用循环调用2022-3-22上海大学计算机学院20总体设计总体设计面向数据流的设计方法面向数据流的设计方法基本思想:基本思想: DFD 结构图结构图两种信息流类型两种信息流类型 变换流:掌握从变换流到初始结构图的转换变换流:掌握从变换流到初始结构图的转换 事务流事务流2022-3-22上海大学计算机学院21详细设计详细设计详细设计的任务详细设计的任务不是具体地编写程序,而是设计程序的不是具体地编写程序,而是设
20、计程序的“蓝图蓝图”,确定每个模块,确定每个模块的处理过程。的处理过程。结构程序设计结构程序设计自顶向下逐步求精;自顶向下逐步求精;具有单入、单出的控制结构(取消具有单入、单出的控制结构(取消GOTO语句);语句);结构化定理:任何单入口单出口的程序都可以由结构化定理:任何单入口单出口的程序都可以由“顺序顺序”、“选选择择”和和“循环循环”三种基本结构实现。三种基本结构实现。过程设计的工具(过程设计的工具(重点是画图重点是画图)程序流程图程序流程图盒图盒图PAD图图判定表判定表2022-3-22上海大学计算机学院22详细设计详细设计程序流程图的基本符号程序流程图的基本符号( (1) 1) 顺序
21、结构顺序结构AB(2) (2) 选择结构选择结构PBAFT(3) (3) 先判定型循环结构先判定型循环结构TPSF(4) (4) 后判定型循环结构后判定型循环结构FSTP(5) (5) 多情况选择多情况选择(case structure)2022-3-22上海大学计算机学院23详细设计详细设计PAD图的基本符号图的基本符号2022-3-22上海大学计算机学院24详细设计详细设计判定表判定表2022-3-22上海大学计算机学院25实现实现 编码风格编码风格 编码风格的作用就是使编码风格的作用就是使代码容易读代码容易读; 风格良好的代码更容易阅读和理解,错误更少;风格良好的代码更容易阅读和理解,错
22、误更少;1.使用一致和有意义的标识符名使用一致和有意义的标识符名2.用缩进显示程序结构用缩进显示程序结构3.用加括号的方式排除二义性用加括号的方式排除二义性4.避免大量使用循环嵌套和条件嵌套避免大量使用循环嵌套和条件嵌套5.当心运算符的副作用当心运算符的副作用6.把数定义称常量把数定义称常量7.利用利用sizeof()计算对象的大小计算对象的大小8.清晰的代码,而非最巧妙的代码清晰的代码,而非最巧妙的代码9.程序的注释程序的注释序言性注释和功能性注释对一段程序注释,而不是每一个语句10. 使用数据结束标记(使用数据结束标记(EOF、BOF),不要指定数据的数目来判断文件),不要指定数据的数目来
23、判断文件的结束。的结束。2022-3-22上海大学计算机学院26实现实现 测试测试 测试的目的测试的目的就是在软件投入生产性运行之前,尽可能多地发现软就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。件中的错误。测试是为了发现程序中的错误而执行程序的过程。测试是为了发现程序中的错误而执行程序的过程。 调试的目的调试的目的是诊断并改正错误。是诊断并改正错误。 对软件规格说明、设计和编码的最后复审。对软件规格说明、设计和编码的最后复审。 开发总工作量的开发总工作量的40%40%以上,极端情况下,其他开发步骤总成本的以上,极端情况下,其他开发步骤总成本的3 3倍到倍到5 5倍。倍。 好的测试
24、方案是极可能发现迄今为止尚未发现的错误的测试方案。好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案。 成功的测试成功的测试是发现了至今为止尚未发现的错误的测试。是发现了至今为止尚未发现的错误的测试。 测试只能查找出程序中的错误,不能证明程序中没有错误。测试只能查找出程序中的错误,不能证明程序中没有错误。 Pareto原理:原理:80%的错误很可能是的错误很可能是20%的模块造成的。的模块造成的。 从从“小规模小规模”测试逐步到测试逐步到“大规模大规模”测试。测试。 穷举测试是不可能的。穷举测试是不可能的。 为了达到最佳的测试效果,应该由为了达到最佳的测试效果,应该由独立的第三方独立的第
25、三方从事测试工作。从事测试工作。2022-3-22上海大学计算机学院27实现实现测试方法测试方法 黑盒测试:又称功能测试或数据驱动测试黑盒测试:又称功能测试或数据驱动测试 白盒测试:又称结构测试或逻辑驱动测试白盒测试:又称结构测试或逻辑驱动测试 测试步骤测试步骤 模块测试(模块测试(单元测试)单元测试) 在这个测试步骤中所发现的往往是在这个测试步骤中所发现的往往是编码和详细设计编码和详细设计的错误的错误 子系统测试子系统测试 模块放在一起形成一个子系统来测试模块放在一起形成一个子系统来测试 着重测试着重测试模块的接口模块的接口 系统测试系统测试 经过测试的子系统装配成一个完整的系统来测试经过测
26、试的子系统装配成一个完整的系统来测试 发现的往往是发现的往往是软件设计中的软件设计中的错误,也可能发现需求说明中的错误错误,也可能发现需求说明中的错误 验收测试(确认测试)验收测试(确认测试) 它的目标是验证软件的有效性(如果软件的功能和性能如同用户所合理期待它的目标是验证软件的有效性(如果软件的功能和性能如同用户所合理期待的那样,软件就是有效的)的那样,软件就是有效的) 用户积极参与,可能主要使用实际数据进行测试用户积极参与,可能主要使用实际数据进行测试 发现的往往是发现的往往是系统需求说明书中的系统需求说明书中的错误错误 平行运行平行运行集成测试集成测试2022-3-22上海大学计算机学院
27、28实现实现回归测试回归测试回归测试是指回归测试是指重新执行已经做过的测试重新执行已经做过的测试的某个子集,以保证变化的某个子集,以保证变化(程序改错、新模块加入等)没有带来非预期的副作用。(程序改错、新模块加入等)没有带来非预期的副作用。( ( ) Alpha) Alpha测试测试Alpha测试由用户在开发者的场所进行,并且在开发者对用户的测试由用户在开发者的场所进行,并且在开发者对用户的“指导指导”下进行测试。开发者负责记录发现的错误和使用中遇到下进行测试。开发者负责记录发现的错误和使用中遇到的问题。总之,的问题。总之,Alpha测试是在受控的环境中进行的。测试是在受控的环境中进行的。(
28、( ) Beta) Beta测试测试软件的多个用户在一个或多个用户的实际使用环境下进行的测试。软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,是在开发者无法控制的环境下进行的开发者通常不在测试现场,是在开发者无法控制的环境下进行的软件现场应用。软件现场应用。2022-3-22上海大学计算机学院29实现实现集成测试方法集成测试方法非渐增式集成非渐增式集成 先分别测试每个模块,再把所有模块按设计要求放在一起结合成所先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序。要的程序。 先进行单元测试,再进行集成测试先进行单元测试,再进行集成测试渐增式集成渐
29、增式集成将单元测试与集成测试结合在一起,把下一个要测试的模块同已经将单元测试与集成测试结合在一起,把下一个要测试的模块同已经测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合进来测试。测试的模块结合进来测试。自顶向下自顶向下(Top-Down)集成集成自底往上(自底往上(Bottom-Up)集成)集成三明治式(三明治式(Sandwich)集成集成2022-3-22上海大学计算机学院30实现实现方法方法优点优点不足不足非渐增式集成非渐增式集成自顶向下集成自顶向下集成自底往上集成自底往上集成三明治式集成三明治式集成错误
30、隔离错误隔离较早发现主要设计错误较早发现主要设计错误错误隔离错误隔离可复用模块得到充分测试可复用模块得到充分测试错误隔离错误隔离较早发现主要设计错误较早发现主要设计错误可复用模块得到充分测试可复用模块得到充分测试没有错误隔离手段没有错误隔离手段主要设计错误发现迟主要设计错误发现迟可复用模块得不到充分测试可复用模块得不到充分测试主要设计错误发现迟主要设计错误发现迟几种集成测试方法的优缺点几种集成测试方法的优缺点2022-3-22上海大学计算机学院31实现实现 白盒测试技术:逻辑覆盖白盒测试技术:逻辑覆盖 定义:以定义:以的设计测试用例的技术的设计测试用例的技术 类型类型1.1. 语句覆盖:语句覆
31、盖:选择足够多的测试数据,使被测程序中每个语句至少执行一次。 2.2. 判定覆盖:判定覆盖:判定覆盖又叫分支覆盖,选择足够多的测试数据使每个判定的每个分支都至少执行一次。3.3. 条件覆盖:条件覆盖:选择足够多的测试数据使每个判定表达式中的每个条件都取到各种可能的结果4.4. 判定条件覆盖:判定条件覆盖:选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。5.5. 条件组合覆盖:条件组合覆盖:选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。 设计测试用例(设计测试用例(会做会做)2022-3-22上海大学计算
32、机学院32实现实现 黑盒测试技术黑盒测试技术1. 等价划分等价划分 把程序的输入域划分成若干个数据类,每类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同。据此导出测试用例。 设计测试用例(1) 设计一个新的测试方案以尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止;(2) 设计一个新的测试方案,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止。2. 边界值分析边界值分析 着重测试输入等价类和输出等价类的边界,选取的测试数据应该刚好等于、刚刚小于和刚刚大于边界值。 会用等价划分和边界值分析法设计测试用例会用等
33、价划分和边界值分析法设计测试用例2022-3-22上海大学计算机学院33维护维护所谓软件维护就是在软件已经交付使用之后,为了改正所谓软件维护就是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。保证软件在一错误或满足新的需要而修改软件的过程。保证软件在一个相当长的时期能够正常运行。个相当长的时期能够正常运行。60%以上以上, 这个百分比还在持续上升。这个百分比还在持续上升。维护类型维护类型 改正性维护改正性维护诊断和改正错误的过程。诊断和改正错误的过程。17%21% 适应性维护适应性维护为了适应环境的变化进行的修改软件的活动。为了适应环境的变化进行的修改软件的活动。 18%2
34、5% 完善性维护完善性维护增加新功能或修改已有功能。增加新功能或修改已有功能。 50%66% 预防性维护预防性维护为了改进未来的可维护性或可靠性,或为了给未来的改进奠为了改进未来的可维护性或可靠性,或为了给未来的改进奠定更好的基础而修改软件。定更好的基础而修改软件。4%左右左右2022-3-22上海大学计算机学院34维护维护可维护性:可维护性:维护人员理解、改正、改动或改进这维护人员理解、改正、改动或改进这个软件的难易程度。个软件的难易程度。提高可维护性是支配软件工程方法学所有步骤的提高可维护性是支配软件工程方法学所有步骤的关键目标。关键目标。决定软件可维护性的因素决定软件可维护性的因素1)可
35、理解性)可理解性2)可测试性)可测试性3)可修改性)可修改性4)可移植性)可移植性5)可重用性)可重用性2022-3-22上海大学计算机学院35面向对象方法学引论面向对象方法学引论面向对象方法学的面向对象方法学的4个要点个要点1) 客观世界是由各种客观世界是由各种对象(对象(Object)组成。面向对象的软件系统是组成。面向对象的软件系统是由对象组成的。由对象组成的。2) 对象组成对象对象组成对象类类(Class)。类是具有相同属性和行为的对象的集合。类是具有相同属性和行为的对象的集合。每个对象类定义了一组数据和一组方法。每个对象类定义了一组数据和一组方法。3) 按照子类按照子类(派生类派生类
36、)与父类与父类(基类基类)的关系,对象类组成一个层次结的关系,对象类组成一个层次结构的系统构的系统(类等级类等级)。子类。子类继承继承(inheritance)父类的数据和方法。父类的数据和方法。4) 对象彼此之间仅能通过传递对象彼此之间仅能通过传递消息消息(Message)互相联系。互相联系。OO=objects+classes+inheritance+communication with messages面向对象面向对象 = 对象对象 + 类类 + 继承继承 + 消息通信消息通信2022-3-22上海大学计算机学院36面向对象方法学引论面向对象方法学引论总存在用错误的数据调用正确的模块,总
37、存在用错误的数据调用正确的模块,或用正确的数据调用错误的模块的危险。或用正确的数据调用错误的模块的危险。与人类习惯的思维方法一致,解空间与问与人类习惯的思维方法一致,解空间与问题空间一致题空间一致v 以对象为核心,数据以及数据上的操作以对象为核心,数据以及数据上的操作封装为一个统一体封装为一个统一体-对象对象v 软件系统由对象组成,以对象间的消息软件系统由对象组成,以对象间的消息模拟实体间的联系。模拟实体间的联系。v 抽象思维,归纳思维,演绎思维抽象思维,归纳思维,演绎思维v 开发围绕建立问题领域的对象模型,是开发围绕建立问题领域的对象模型,是一个逐步深化的渐进过程一个逐步深化的渐进过程解空间
38、与问题空间不一致解空间与问题空间不一致v 以算法为核心,数据和过程分离。以算法为核心,数据和过程分离。v 软件系统由模块组成,模块间通过调软件系统由模块组成,模块间通过调用来集成系统。用来集成系统。v 自顶向下按部就班。自顶向下按部就班。较差较差v基于功能分解,需求变化大多针对功能基于功能分解,需求变化大多针对功能v功能变化引起软件结构的整体修改功能变化引起软件结构的整体修改较好较好v功能需求变化仅需要作一些局部性的修改功能需求变化仅需要作一些局部性的修改v可派生子类以实现功能扩充或修改可派生子类以实现功能扩充或修改较差较差v标准函数库标准函数库不是自含的和独立的不是自含的和独立的v模块重用,
39、则相应的数据也必须重用。模块重用,则相应的数据也必须重用。较好较好v通过对象实例或派生类通过对象实例或派生类v方便修改和扩充,且不影响原有类的使用方便修改和扩充,且不影响原有类的使用较易较易v可分解成相互独立的小产品可分解成相互独立的小产品较难较难v分而不解分而不解较好较好v稳定性好,易修改,易理解。稳定性好,易修改,易理解。较差较差v稳定性较差,较难修改,较难理解。稳定性较差,较难修改,较难理解。思维方法思维方法特性特性面向对象方法面向对象方法传统方法传统方法稳定性稳定性开发大型软件开发大型软件可维护性可维护性可重用性可重用性2022-3-22上海大学计算机学院37面向对象方法学引论面向对象
40、方法学引论面向对象的一些概念面向对象的一些概念对象对象:封装了数据结构及可以施加在这些数据结构上的操作:封装了数据结构及可以施加在这些数据结构上的操作(服(服务或方法)务或方法)的封装体。的封装体。类类:具有相同数据和相同操作的一组相似对象的集合:具有相同数据和相同操作的一组相似对象的集合消息消息:要求某个对象执行在定义它的那个类中所定义的某个操作:要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明。的规格说明。方法方法:对象所能执行的操作,也就是类中所定义的服务。(如:对象所能执行的操作,也就是类中所定义的服务。(如C+的成员函数)的成员函数)属性属性:类中所定义的数据(如:类中所
41、定义的数据(如C+的数据成员)的数据成员)封装封装:表示对象状态的数据和实现操作的代码与局部数据,都被:表示对象状态的数据和实现操作的代码与局部数据,都被封装在黑盒子里面,不能从外面直接访问或修改这些数据和代码。封装在黑盒子里面,不能从外面直接访问或修改这些数据和代码。 继承继承:是子类自动地共享基类中定义的数据和方法的机制。:是子类自动地共享基类中定义的数据和方法的机制。多态性多态性:同一方法,不同的子类有不同的实现。:同一方法,不同的子类有不同的实现。函数重载函数重载:是指在同一作用域内的若干个参数特征不同的函数可以使是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字。用相
42、同的函数名字。2022-3-22上海大学计算机学院38面向对象分析面向对象分析 面向对象分析基本顺序面向对象分析基本顺序1) 寻找类寻找类&对象;对象;2) 识别结构;识别结构;3) 识别主题;识别主题;4) 定义属性;定义属性;5) 建立动态模型;建立动态模型;6) 建立功能模型;建立功能模型;7) 定义服务。定义服务。2022-3-22上海大学计算机学院39面向对象方法学面向对象方法学面向对象建模面向对象建模三种三种模型模型 对象模型对象模型:它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述系统的数据结构。 动态模型:描述系统的控制结构。 功能模型:描述系统的功能建模图形工具(
43、建模图形工具(根据描述画图根据描述画图) 类图类图:类图描述类及类与类之间的静态关系(关联、聚集、泛化等)。 类的状态图类的状态图:通过描绘对象的状态及引起对象状态转换的事件,来表示对象的行为。 用例图:用例图:描述的是外部行为者所理解的系统功能。系统、行为者、用例及用例之间的关系。 事件跟踪图(顺序图)事件跟踪图(顺序图)2022-3-22上海大学计算机学院40面向对象设计面向对象设计面向对象设计的任务面向对象设计的任务系统设计系统设计: 确定实现系统的策略和目标系统的高层结构确定实现系统的策略和目标系统的高层结构;对象设计对象设计: 确定解空间中的类、关联、接口形式及实现服务的算确定解空间
44、中的类、关联、接口形式及实现服务的算法。法。2022-3-22上海大学计算机学院41面向对象设计面向对象设计面向对象设计的准则面向对象设计的准则 模块化、抽象、信息隐藏模块化、抽象、信息隐藏 耦合耦合(1) 交互耦合对象之间的耦合通过消息连接来实现,则这种耦合就是交互耦合。应该尽量减少消息中包含的参数个数,降低参数的复杂程度。减少对象发送(或接收)的消息数。(2) 继承耦合继承是一般化类与特殊类之间耦合的一种形式。设计应该使特殊类尽量多继承并使用其一般化类的属性和服务。 内聚内聚(1) 服务内聚一个服务应该完成一个且仅完成一个功能。(2) 类内聚类的属性和服务应该全都是完成该类对象的任务所必需
45、的,其中不包含无用的属性或服务。(3) 一般-特殊内聚一般-特殊结构应该是对相应的领域知识的正确抽取。2022-3-22上海大学计算机学院42面向对象设计面向对象设计重用重用 重用有两方面的含义:重用有两方面的含义: 一是尽量使用已有的类,二是如果确实需要创一是尽量使用已有的类,二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。 类构件的重用方式类构件的重用方式(1) 实例重用 按照需要创建类的实例 用几个简单的对象作为类的成员创建出一个更复杂的类。(2) 继承重用 为提高继承重用的效果,关键是设计一个
46、合理的、具有一定深度的类构件继承层次结构。(3) 多态重用 利用多态性不仅可以使对象的对外接口更加一般化,从而降低了消息连接的复杂程度,而且还提供了一种简便可靠的软构件组合机制。 转换接口:类构件在重用时都必须重新定义的服务的集合。 扩充接口:如果在派生类中没有给出扩充接口的新算法,则将继承父类中的算法。2022-3-22上海大学计算机学院43面向对象设计面向对象设计子系统间的交互方式子系统间的交互方式(1)客户客户-供应商关系:单向交互供应商关系:单向交互 “客户” 子系统调用 “供应商” 子系统, “供应商” 子系统完成某些服务工作并返回结果。(2) 平等伙伴关系:双向交互平等伙伴关系:双
47、向交互每个子系统都可能调用其他子系统,因此,每个子系统都必须了解其他子系统的接口。2022-3-22上海大学计算机学院44面向对象设计面向对象设计设计关联设计关联实现关联的具体策略实现关联的具体策略 单向遍历 双向遍历 用属性实现两个方向的关联用属性实现两个方向的关联 用独立的关联对象实现双向关联用独立的关联对象实现双向关联2022-3-22上海大学计算机学院45面向对象设计面向对象设计1,用属性实现一个方向的关联,用属性实现一个方向的关联2,用属性实现两个方向的关联,用属性实现两个方向的关联3,用独立的关联对象实现双向关联,用独立的关联对象实现双向关联2022-3-22上海大学计算机学院46
48、面向对象设计面向对象设计 设计优化设计优化1. 提高效率的几项技术提高效率的几项技术(1 1)增加冗余关联以提高访问效率)增加冗余关联以提高访问效率(2 2)调整查询次序)调整查询次序(3 3)保留派生属性)保留派生属性2. 调整继承关系调整继承关系(1 1)抽象与具体)抽象与具体(2 2)为提高继承程度而修改类定义)为提高继承程度而修改类定义(3 3)利用委托实现行为共享)利用委托实现行为共享仅当存在真实的一般-特殊关系(即子类确实是父类的一种特殊形式)时,利用继承机制实现行为共享才是合理的。2022-3-22上海大学计算机学院47面向对象设计面向对象设计listaddremovefirstlaststackpushpoplistaddremovefirstlaststackpushpop利用委托实现行为共享利用委托实现行为共享