可行性研究(cont.)
技术可行性
操作可行性
经济可行性
RUP四个阶段:初始、精化、构建、移交
(1)什么是软件的生命周期?生命周期可以概括成几个过程?对于软件工程,生命周期的概念为什么非常重要?瀑布和快速原型两种软件工程模式生命周期的主要不同点在哪里?
(2)瀑布和快速原型两种模式各适合于哪些软件系统的开发?为什么?请根据你的了解或实践举例说明。
需求分析是软件生存期的一个重要阶段,是软件开发项目得以成功的基础。
需求分析的目的是保证需求的完整性和一致性。
需求工程:对系统应该提供的服务和所受到的约束进行理解、分析、建立文档、检验的过程
软件需求的三种类型:功能需求 非功能需求 设计约束
SA用抽象模型的概念,按照软件内部数据传递、变换的关系,自顶向下逐层功能分解的系统分析方法来定义系统的需求。
DD是对所有与系统相关的数据元素的一个有组织的列表,以及精确的、严格的定义,使得用户和系统分析员对于输入、输出、存储成分和中间计算有共同的理解。
DD是关于数据的信息的集合,即对数据流图中包含的所有元素的定义的集合。
几乎在任何情况下都需要使用用例,通过用例可以获取用户需求,规划和控制项目。
获取用例是需求分析阶段的主要工作之一,而且是首先要做的工作。
一个用例模型由若干幅用例图组成。创建用例模型的工作包括: 定义系统,寻找行为者和用例,描述用例,定义用例之间的关系,确认模型。
OOA就是抽取和整理用户需求并建立问题域精确模型的过程
大型、复杂系统的对象模型通常由下述5个层次组成:主题层、类与对象层、结构层、属性层和服务层。
***设计原理:
模块化、抽象、逐步求精、信息隐藏和局部化、模块独立
从技术的角度,传统的结构化方法将软件设计划分为体系结构设计、数据设计、接口设计和过程设计4部分。
结构设计:定义软件系统各主要成份之间的关系。
数据设计:将实体–关系图中描述的对象和关系,以及数据词典中描述的详细数据内容转化为数据结构的定义。
接口设计:软件内部各成份之间、软件与其它协同系统之间及软件与用户之间的交互机制。
过程设计:把结构转换成软件的过程性描述。
为什么要模块化?
模块化是为了使一个复杂的大型程序能被人的智力所管理。
如果一个大型程序仅由一个模块组成,它将很难被人所理解。
模块化的作用:
采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。
模块化使软件容易测试和调试,因而有助于提高软件的可靠性。
模块化能够提高软件的可修改性。
模块化也有助于软件开发工程的组织管理。
应该采取下述设计原则:
尽量使用数据耦合,
少用控制耦合和特征耦合,
限制公共环境耦合的范围,
完全不用内容耦合。
人机界面设计:
三条“黄金规则”:
置用户于控制之下。
减少用户记忆负担。
保持界面一致。
人机界面设计指南 一般交互指南 信息显示指南 数据输入指南
面向对象设计的准则
1. 模块化
对象就是模块。它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。
2. 抽象
面向对象方法不仅支持过程抽象,而且支持数据抽象。
3. 信息隐藏
在面向对象方法中,信息隐藏通过对象的封装性实现。
4. 弱耦合
耦合指不同对象之间相互关联的紧密程度。
5. 强内聚
6. 可重用
重用基本上从设计阶段开始。
重用也叫再用或复用,是指同一事物不作修改或稍加改动就多次重复使用。
广义地说,软件重用可分为以下3个层次:
知识重用(软件工程知识的重用)。
方法和标准的重用(面向对象方法或国家制定的软件开发规范的重用)。
软件成分的重用。
2. 软件成分的重用级别
代码重用:调用库中的模块
源代码剪贴
源代码包含 #include
继承
设计结果重用:重用某个软件系统的设计模型。这个级别的重用有助于把一个应用系统移植到完全不同的软硬件平台上。
分析结果重用:重用某个系统的分析模型。这种重用特别适用于用户需求未改变,但系统体系结构发生了根本变化的场合。
面向对象技术中的“类”,是比较理想的可重用软构件,称之为类构件。
1. 可重用软构件应具备的特点
模块独立性强 :具有单一、完整的功能,且经过反复测试被确认是正确的。
具有高度可塑性:必须提供为适应特定需求而扩充或修改已有构件的机制,且使用起来非常简单方便。
接口清晰、简明、可靠:详尽的文档说明。
2. 类构件的重用方式
实例重用(封装性)
使用适当的构造函数,按照需要创建类的实例。
用几个简单的对象作为类的成员创建出一个更复杂的类。
继承重用(继承性)
继承重用提供了一种安全地修改已有类构件,以便在当前系统中重用的手段。
多态重用(多态性)
使对象的对外接口更加一般化,降低消息连接的复杂程度。
大多数系统的面向对象设计模型,在逻辑上都由4大部分组成。
问题域子系统
人机交互子系统
任务管理子系统
数据管理子系统
开闭原则: 一个软件的实体应该对扩展开放,对修改关闭;
设计模式中提倡面向接口的编程,而不提倡面向实现的编程。
设计模式中常用的复用技术有两种,即类继承和对象组合,优先对象组合,而不是类继承
整个设计模式贯穿一个原理:面对接口编程,而不是面对实现。目标原则是:降低耦合,增强灵活性。
通常在编写出每个模块之后就对它做单元测试。
在这个阶段结束之后,对软件系统还应该进行各种综合测试,通常由专门的测试人员承担这项工作。
1. 程序内部的文档
恰当的标识符
含义鲜明的名字
缩写规则一致,并给每个名字加注解
适当的注解
每个模块开始处的序言性注解
与一段程序代码有关的注解
程序的视觉组织
阶梯形式
程序的效率是指程序的执行速度及程序所需占用的内存的存储空间。
软件测试准则
所有测试都应该能追溯到用户需求
最严重的错误是导致程序不能满足用户需求的那些错误
应该远在测试开始之前就制定出测试计划
完成了需求模型就可以制定测试计划
把Pareto原理应用到软件测试中
测试发现的错误中80%很可能是由程序中20%的模块造成的
应该从“小规模”测试开始,并逐步进行“大规模”测试
单个程序模块 集成的模块簇 整个系统
穷举测试是不可能的
测试只能证明程序中有错误,不能证明程序中没有错误
为了达到最佳的测试效果,应该由独立的第三方从事测试工作
开发软件的软件工程师不是完成全部测试工作的最佳人选
单元测试 测试重点
模块接口
局部数据结构
重要的执行通路
出错处理通路
边界条件
把测试数据和预期的输出结果称为测试用例。
软件可靠性:
程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。
软件的可用性:
程序在给定的时间点,按照规格说明书的规定,成功地运行的概率。