《软件构造》课程复习纲要
1. 软件构造的概念
1) 测试和调试的区别
测试是为了发现错误 调试是为了改正错误
2) 软件开发包括哪些:
问题定义 需求分析 实现计划 总体设计
详细设计 (部分) 编码实现 系统集成 单元测试(部分) 系统测试 校正性的维护 功能强化
3) 软件构造活动主要是其中哪些部分?(以上黑体部分)
4) 软件构造的重要性
? 构造活动是开发软件的重要组成部分 ? 构造活动在开发软件中处于枢纽地位
? 把主要精力集中于创建活动,可以极大地提高程序员的生产效率 ? 创建活动的产品,源代码,往往是软件的唯一精确描述 ? 创建活动是唯一一项必不可少的工作
5) 隐喻(Software Metaphors)
? 常见的软件隐喻 (简单了解)
? 软件书写:写代码(Writing Code)
? 软件播种:生成系统(Growing a System)
? 软件珍珠培植法:系统积累(System Accretion) ? 软件创建:建造软件(building software)
? 实用软件技术:智能工具箱(The Intellectual Toolbox) ? 复合隐喻(Combing Metaphors) 2. 软件构造的前期准备工作
1) 软件构造的前期准备工作有哪些?
? 前期准备工作并非一成不变
构建活动的准备工作要根据项目特点调整 具体细节随项目的不同会有很大变化
? 构造开始前的准备工作有哪些
辨明软件项目的类型
明确问题定义 (问题定义:项目要解决的问题是什么) 明确需求规约 (需求定义详细规定了软件系统应该做什么)
明确软件架构的各组成部分(软件设计的高层部分,用于支撑更加细节的设计的框架)
什么是软件构造的前期准备工作
? 软件构造的前期准备工作是复查性的活动
明确前导性的工作结果有哪些
1
重新审视前导性工作是否完成 明确前导性工作完成的程度如何
? 准备工作的中心目标是降低风险
糟糕的需求分析 糟糕的项目计划 3. 构造技术
1) 模块化设计 (简单了解相关概念)
模块化设计的目标是使每个子程序都成为一个“黑盒子”:
? 你知道进入盒子和从盒子里出来的是什么,却不知道里边发生什么 ? 通过接口的定义明确其功能
“模块化”同时涉及到子程序设计和模块设计:
? 单独的子程序无法实现“黑盒子”的目标,因而需要模块 ? 但通过对子程序的控制可以达到模块化的效果
? 通过对一组子程序定义统一对外的接口,也完全有可能达到高度模块化这一目标 2) 模块和子程序的区别
? 子程序是具有一定功能的,可以调用的函数或过程,它可以封装为模块 ? 模块是指数据及作用于数据的子程序的集合,或者
? 模块也可能是指,可以提供一系列互相联系功能的子程序集合,而这些子程序之间不一定有公共的数据,
它是设计的最基本单元
3) 模块化:内聚性与耦合性(重要) 模块独立程度的衡量标准:
耦合性(Coupling):对一个软件结构内不同模块间互连程度的度量。 内聚性(Cohesion):标志一个模块内各个处理元素彼此结合的紧密程度,理想的内聚模块只做一件事情。
模块的内聚性:
内聚性表示了在一个模块中,各种操作及数据之间互相联系的紧密程度 内聚性的强弱程度用“强度”表示 应尽量提高内聚程度 强调“强内聚”的目的:
每一个模块只需作好一项工作,而不必过分考虑其它任务 模块内聚性分类:
偶然内聚:一组任务关系松散(低)
逻辑内聚:一组任务在逻辑上同属一类,例如均为输出(低) 时间内聚:一组任务必须在同一段时间内执行(低) 子程序的内聚性:
模块的强内聚性并不说明子程序内聚性强 子程序的内聚性影响到模块的实现质量 子程序内聚性分类:
可取的内聚性:
功能内聚性(最高):
功能内聚性是最强也是最好的一种内聚
当程序执行一项并且仅仅是一项工作时,属于功能内聚
2
顺序内聚性(较高):
子程序内包含需要按特定顺序进行的、逐步分享数据而又不形成一个完整功能的操作
通讯内聚性(中):
在一个子程序中,两个操作只是使用相同数据,而不存在其它任何联系时产生的
临时内聚性(低):
因为同时执行的原因才被放入同一个子程序里,这时产生临时内聚性
不可取的内聚性:
不可取的内聚性往往导致一些组织混乱而又难以调试和改进的代码 应尽量避免不可取的内聚性的出现
过程内聚性:
当子程序中的操作是按某一特定顺序进行的,就是过程内聚性 过程内聚性和顺序内聚性的区别:
? 顺序内聚性中的顺序操作使用的是相同数据 ? 过程内聚性中的操作使用的并不是相同数据
逻辑内聚性:
当一个子程序中同时含有几个操作,而其中一个操作又被传进来的控制标志所选择时,就
产生了逻辑内聚性
其内部操作仅仅是因为控制流,或者说“逻辑”的原因才联系到一起
3
偶然内聚性:
当同一个子程序中的操作之间无任何联系时,为偶然内聚性 偶然内聚性也叫作“无内聚性”
模块耦合性:
耦合性表示相互作用的模块之间的互连程度 应尽量降低模块之间的耦合性 强调“松耦合”的目的:
模块应被设计成可以提供一整套功能,以便程序的其它部分与它清楚地相互作用 耦合分类:
无任何连接:两个模块中的每一个都能独立地工作而不需要另一个的存在(最低耦合)。 数据耦合:两个模块彼此通过参数交换信息,且交换的仅仅是数据(低耦合)。 控制耦合:两个模块之间传递的信息有控制成分(中耦合)。 公共环境耦合:两个或多个模块通过公共环境相互作用
? 一个存数据,一个取数据(低耦合) ? 都存取数据(低--中之间)
内容耦合:
? 一个模块访问另一个模块的内部数据 ? 两个模块有一部分程序代码重叠
常见的OO耦合:
简单数据参数耦合:两个对象之间通过参数传递数据,并且为简单数据类型 简单对象耦合:一个对象实例化另一个对象所形成的耦合关系 对象参数耦合:两个对象之间通过对象参数传递数据 语义上的耦合 信息隐蔽
信息隐蔽有称为“封装”:使外部的可见部分和内部的不可见部分相互隔离 信息封装是设计模块和子程序的一种重要方法
对于模块而言,封装的部分称为内部信息,公开的部分称为模块的公开信息或接口
4) 结构化设计vs.面向对象设计(理解) 从模块的角度理解结构化设计和OO设计的区别:
面向对象设计中的模块与结构化设计中模块的含义是一致的
数据和功能的封装;满足信息隐蔽的要求;追求高内聚低耦合
结构化设计中模块和模块之间的关系,被紧紧局限于信息流(结构化设计是面向功能)
面向对象设计方法,充分挖掘了“关系”的表达方式,可以尽可能的将事物之间复杂的关系予以体现
面向对象中模块之间的关系:
OO中的模块由“对象” 来体现 OO中模块之间的关系(主要):包含:“有一个……”关系;继承:“是一个……”关系 5) 抽象数据类型(ADT)
了解基本概念,能够构造出简单的ADT
? 类的基础:抽象数据类型
? 类是一组数据和子程序构成的集合,这些数据和子程序共同拥有一组内聚的、明确定义的职责。 ? ADT是指一组数据以及对这些数据所进行的操作的集合
4
? 以上两段描述有何本质区别?
? 从数据的角度来看类和ADT没有区别
? 从OO的角度来看,类还涉及到面向对象中的概念
? 抽象数据类型中的“数据”
? ADT中“数据” 的概念很随意
? ADT中的“数据”可以指任意类(Class)所能描述的实体
6) ADT与类的区别
体会ADT和类在概念上有什么区别。
给你一个ADT,构造出相应的类(Java或C++)
ADT:一些数据以及对这些数据进行操作的集合 + 面向对象(封装、继承、多态)= 类
构造类时class{}
7) 良好的类接口 参阅CC2-6.2节
给你不良好的类接口,能够指出其中的问题,并加以改进 (难度限于书中例子的难度)
5
相关推荐: