一、软件
软件定义
计算机程序、文档、运行程序所必须的方法、数据、规则。方法和规则在文档中说明,在程序中实现。(文档+程序+数据)
软件分类
基于软件功能的划分
- 系统软件:与计算机硬件紧密配合使计算机各个部件与相关软件和数据协调、高校工作的软件。(如:操作系统、编译程序)
- 支撑软件:协助用户开发软件的工具性软件(北大青鸟)
- 应用软件:商业数据处理软件、工程与科学计算软件(CAD)、智能产品嵌入式软件(家用电器、智能手机)、人工智能软件(专家系统、模式识别软件)、个人计算机软件。
基于软件规模的划分
根据参加人员数、开发周期、产品规模(代码行LOC)决定:微型、小型、中型、大型、极大型。
软件发展
程序设计阶段、程序系统阶段、软件工程阶段(集中主机、客户机服务器两层模式、客户机服务器三层模式、浏览器服务器模式)、新技术(专家系统、云计算)
软件危机
在计算机软件开发和维护过程中遇到的一系列严重问题。
- 开发成本和进度估计不准
- 用户对已交付的软件不满意
- 软件产品质量靠不住
- 软件可维护性差
- 软件没有适当的文档资料
软件工程
把系统化、规范化、可度量的途径应用于软件开发、运行和维护过程中;研究其实现途径(内容:软件工程技术、软件工程管理)
软件生存周期
软件从产生、发展到成熟、直至衰亡为止。
阶段:
- 可行性研究与计划
- 需求分析
- 总体设计
- 详细设计
- 实现(编码和单元测试)
- 集成测试
- 确认测试
- 使用和维护
软件过程模型
- 瀑布模型
特点:阶段具有顺序性和依赖性、推迟实现的观点、质量保证的观点
缺点:过于理想化,出错无法改正(增加反馈环)、缺乏灵活性,无法解决需求不明确的问题
优点:提高软件质量、降低软件成本、缓解软件危机 - 快速原型模型
特点:快速建立反映用户主要需求(需求不确定)的原型系统,反复由用户评价修正需求,开发出最终产品
缺点:质量低下,内部结构不好
优点:确定需求上优于瀑布模型、提供学习手段、有的原型可以成为最终产品的一部分 - 增量模型
特点:开发软件时将软件产品作一系列增量构建设计、编码、集成和测试
缺点:结构开放比较困难
优点:较短时间向用户提交可用的产品、用户有时间学习适应产品、软件结构必须开放,方便向现有产品加入新构建 - 螺旋模型
特点:制定计划、风险分析、实施工程、客户评估(每次都进行这四步)
缺点:需要风险评估经验、契约开发通常需要事先指定过程模型和发布产品
优点:大型软件开发项目有较好的风险控制 - 喷泉模型
特点:面向对象生存周期模型,体现迭代(求精,系统某部分被重复工作,相关功能每次迭代中逐渐加入演进系统)和无缝(分析、设计、编码各阶段不存在明显边界)特性。
缺点:可能随时加各种信息、需求和资料,需严格管理文档
优点:无缝、可同步开发、提高开发效率、节省时间、适应面向对象软件
二、结构化软件开发方法
结构化分析
分解化简问题、物理和逻辑表示分开、进行数据与逻辑抽象
步骤
发现需求、求精、建模、软件需求规格说明、复审
结构化分析模型
模型核心:数据字典
数据模型:E-R图表达
功能模型:数据流图(DFD)表达
行为模型:状态转换图
数据模型
- 组成:
- 数据对象:软件必须理解的复合信息表示,复合信息是具有一系列不同性质或属性的事物。事务(报表)、地点(仓库)、角色(学生)
- 属性:定义数据对象性质。学生的属性可为学号、姓名等
- 关系:1:1、1:N、N:M E-R图:
- 实体用矩形框
- 属性用圆角矩形
- 关系用菱形
数据流图
描绘系统逻辑模型,图中没有具体的物理元素,只描绘信息在系统中流动处理的情况。
符号:
附加符号:
解法:
- 从问题描述提取数据流图四种成分
- 着手画数据流图的基本系统模型
- 把基本系统模型细化,描绘系统主要功能
- 主要功能进一步细化
状态转换图
- 行为模型:
- 状态:被观察到的系统行为模式
- 事件:引起状态转换的外界事件抽象
- 行为:进入某状态所做的动作
数据字典
对系统使用的所有数据元素定义的集合,半形式化表示
- 定义描述:
-
数据流:
-
数据元素:
-
*数据存储: *
-
处理:
定义符号:
范例:
三、结构化设计
数据设计、体系结构设计、接口设计、过程设计
结构化设计的概念和原理
模块化:按适当原则把软件划分成一个个较小的、相关而独立的模块
模块:又称“构件”,一般指用一个名字调用的相邻程序元素序列。
模块成本关系图:
抽象:抽出事物本质特性,暂不考虑细节。
求精:为了集中解决主要问题,尽量推迟对细节问题的考虑,与抽象互补。
信息隐藏:每个模块的实现细节对于其他模块来说是隐藏的,用户只通过接口来了解该模块。
模块独立
容易分工合作、容易测试维护
耦合:软件结构中不同模块间互联程度的度量。原则:尽量使用数据耦合,少用控制耦合,限制公共环境耦合,完全不用内容耦合。
非直接耦合:两个模块可以独立工作,没有任何关系。
分类:
- 数据耦合
两模块通过参数交换数据信息。
- 控制耦合
两模块通过参数交换控制信息。
- 公共环境耦合
两个或多个模块通过一公共数据环境作用。
1、 一模块送数据,一模块取数据,等价数据耦合
2、 两模块即送数据也取数据,介于数据耦合和控制耦合之间
- 内容耦合:
1、 一模块访问另一模块内部数据
2、 一模块不通过正常入口进入另一模块内部
3、 两个模块有部分代重叠(汇编语言)
4、 一模块有多个入口
内聚:模块内各个元素的紧密程度。
-
功能内聚
一模块中各个部分是完成某一功能不可缺少的部分 -
顺序内聚
模块内处理元素同某功能密切相关,顺序执行 -
通讯内聚
一模块内各功能部分使用相同输入数据,或产生相同输出数据
-
过程内聚
模块内处理元素相关,特定次序执行。如流程图中循环部分、判定部分、计算部分分成三个模块。
-
时间内聚
要求所有功能在同一时间执行。 -
逻辑内聚
一模块完成功能在逻辑上属于相似一类。
-
偶然内聚
模块内各部分没有联系。
启发式规则
-
改进软件结构提高模块独立性
-
模块规模适中
-
深度、宽度、扇出和扇入应适当
深度:软件结构控制层数,标志系统大小和复杂程度
宽度:软件结构同一层模块数最大值
扇出:一模块直接控制模块数最大值
扇入:有多少上级模块直接调用它 -
模块作用域应在控制域内
模块作用域:受该模块内判定影响的模块集合
控制域:模块本身及所有直接或间接从属它的模块集合 -
降低模块接口复杂程度
-
设计单入口、单出口的模块
-
模块功能可预测(不可预测、过分受限)
面向数据流的设计方法
软件结构图
信息流
变换流
变换分析:将具有变换流特点的数据流图映射成软件结构
- 复查基本系统模型
- 复查并精细化数据流图
- 确定数据流图具有变换特性还是事务特性
- 找出变换中心(确定输入、输出边界)
- 完成二级分解
- 对初步软件结构精化
事务流
事务分析:信息流具有明显事务特点(事务中心)
软件结构:一接受分支和一发送分支
设计过程
人机界面设计
-
系统响应时间
从用户完成某操作到软件给出预计响应。 -
用户帮助措施
-
出错信息处理
-
命令交互
过程设计
确定模块算法、数据结构、接口(系统外部接口、用户界面、内部模块接口细节、输入输出数据)
程序流程图
优点:对控制流程描绘直观,便于初学者掌握
缺点:不是逐步求精的好工具,过早考虑控制流程、用箭头代表控制流、不宜表示数据结构和调用关系
N-S图
特点:功能域明确、不可能任意转移控制、容易确定局部和全程数据的作用域、容易表现嵌套关系和模块层次结构
PAD图
优点:必然是结构化程序、结构十分清晰、表现的逻辑易懂、容易转换成高级源程序、支持自顶向下逐步求精。
判定表/判定树
优点:能清晰表示复杂的条件组合与应作动作间对应关系
过程设计语言
伪码:用正文形式表示数据和处理过程设计工具
程序复杂度
McCabe方法:1、根据过程设计结果画出相应流图2、计算流图环形复杂度
面向数据结构设计方法
Jackson方法
- Jackson图
描述数据结构:顺序、选择、重复
- Jackson方法
四、结构化系统实现
编码
- 机器语言
优点:计算机直接识别
缺点:效率低,重用性差 - 汇编语言
优点:比机器语言易读写、易调试和修改,执行速度快、占内存少,针对硬件编制
缺点:不能编写复杂程序,依赖于机型、不通用、不可移植 - 高级语言
优点:编码效率高、通用性强,兼容性好,便于移植
缺点:运行效率低,对硬件操作不如汇编
语言选择标准
系统用户要求、可以使用的编译程序、可以得到的软件工具、工程规模、程序员知识、软件可移植性、软件应用领域
编码风格
程序内部的文档、数据说明、语句构造、输入输出、效率
测试
测试的目的
测试是为了发现程序中的错误而执行程序的过程、好的测试方案是极有可能发现迄今尚未发现的尽可能多的错误的测试、成功的测试是发现了迄今尚未发现的错误的测试
黑盒测试:如果知道产品应具有的功能,可通过测试来检验每个功能是否正常使用
- 等价类划分
把程序的输入域分成若干数据类(数据特性类似),从每类中选取有代表性的数据作为测试用例。 - 边界值分析法
白盒测试:知道产品内部工作过程可通过测试来检验内部动作是否按照规格说明书规定正常执行。
- 逻辑覆盖
语句覆盖:选择测试数据,使被测程序中每个语句至少执行一次
判定覆盖:每个语句执行一次,每个判定的真假分支至少执行一次
条件覆盖:每个语句执行一次,判定表达式每个条件取各种可能结果
判定/条件覆盖:每个条件都取各种可能,每个判定表达式也都取各种可能
条件组合覆盖:每个判定表达式中条件的各种组合都至少执行一次 - 控制结构测试
基本路径测试:根据过程设计结果(PDL)画出流图、计算流图环形复杂度(流图的区域数)、确定线性独立路径基本集合、设计测试用例执行基本集合中的路径
循环测试:简单循环(0次循环、一次循环、二次循环、m次循环、最大次数循环)、嵌套循环、连锁循环、非结构化循环
测试步骤
- 单元测试
- 集成测试
非渐增式、渐增式、自底向上集成、混合策略、回归测试 - 系统测试
恢复测试、安全性测试、强度测试、性能测试、时间需求 - 确认测试(验收测试)
a测试(功能,界面)、b测试(支持性)
调试
强行排错、回溯法排错、原因排错法
软件可靠性
可靠性:程序在给定时间间隔及环境条件下,按规格说明书的规定,成功运行的概率
可用性:给定时间点,按规格说明书规定,成功运行的概率
五、面向对象方法学
对象+类+继承+传递消息实现通信
概念
对象:具有相同的一组操作集合,对状态和操作的封装
类:对具有相同状态和相同操作的一组相似对象的定义。类是一个抽象数据类型
实例:由某个特定类所描述的一个具体对象
消息:要求某对象执行某个操作的规格说明
方法:对象执行的操作,即类中定义的服务
属性:类中所定义的数据
继承:子类自动共享基类中定义的属性和方法的机制
多态性:在类等级不同层次可共享一个方法名,不同层次每个类按各自需要实现这个方法
重载:函数重载(在同一作用域内,参数特征不同的函数可使用相同的名字)、运算符重载(同一个运算符可以施加于不同类型操作数上面)
与传统方法比较
- 传统方法中数据与过程是分离的,面向对象方法中对象把数据和处理数据的方法封装成一个单元。
- 传统方法中系统是过程的集合,面向对象方法中系统是交互对象的集合。
- 传统方法中过程与数据实体交互,面向对象方法中对象与人或其他对象交互。
- 传统方法中过程接受输入并产生输出,面向对象方法中对象发送与响应消息。
UML
- 静态建模机制
- 用例图:获取执行者、获取用例、执行者间关联、用例关联(泛化、扩展、包含)
- 类图:描述类与类间的静态关系(关联、泛化(继承)、依赖、实现)
- 包图 动态建模机制
- 消息:对象间交互信息
- 顺序图:描述对象间交互
- 协作图:描述对象间交互关系和链接关系
- 活动图 UML物理框架机制
- 构件图:展示一组构件的类型、内部结构和他们之间的关系
- 配置图
面向对象分析
- 步骤:获取需求、整理需求、建立模型(功能模型、对象模型、动态模型)
- 功能模型:用用例图表达,补充用例说明
- 对象模型:描述类及相互关系,表达目标系统静态结构
- 动态模型:用顺序图、状态图
面向对象设计
- 设计准则
抽象、信息隐藏、弱耦合、强内聚、可重性
- 启发规则
设计结果清晰易懂、一般特殊结构深度适当、设计简单类、使用简单协议、使用简单服务
- 设计问题域子系统
- 设计人机交互子系统
- 设计任务管理子系统
- 设计数据管理子系统
面向对象实现
6.1程序设计
6.2测试
6.2.1单元测试
单元:封装类和对象
6.2.2集成测试
6.2.3确认测试
六、软件项目管理
- 软件规模度量
- 工作量估算
- 进度计划
- 组织方式
- 风险控制
- 质量控制
- 配置管理