软件开发的困难
- Complexity 复杂性
- Invisibility 不可见性
- Changeability 易变性
- Conformity 服从性
- Discontinuity 非连续性
软件的生命周期
- The development phase
- The use phase
- The modification phase
- The obsolete phase
软件的开发过程
- Analysis
- Design
- Implementation
- Testing
The analysis phase
- 定义用户以及他们的需求
- 定义系统的需求以及指定模式
- 用户的某些需求可能并不能被软件系统实现
- 分析用户需求与系统要求之间的差别
Steps of analysis
- Elicitation 获取和引导需求
- Analysis & Specification 分析和定义需求
- Validation 验证需求
- Management 管理需求
Aspects of needs
- 对产品的功能性需求
- 对产品开发过程的需求
- 非功能性需求(服务质量需求)
- 综合需求
The design phase
- 定义系统应如何实现那些在 analysis phase 中定义的需求
- 把系统模块化
- 把系统分为小的模块,分别对他们进行设计和测试
- 使用一些工具,比如结构图
- 逻辑图表
- 模块之间的相互影响
The implementation phase
在写代码之前,要使用一些工具
- flowchart 流程图
- pseudocode 伪代码
然后才是coding
The testing phase
黑箱测试和白盒测试
白盒测试是代码覆盖的,黑盒测试是数据覆盖的。
开发过程的模型
Waterfall Model 瀑布模型
Incremental model 增量模型
Agile development model 敏捷开发模型
瀑布模型
单向的,一个阶段不会在它前面的阶段未完成的时候开始。
优点:每一个阶段必须被很好地完成
缺点:很难确定问题所在
增量模型
整个开发过程是分步的,每一步完成整个系统的几部分。
一般来说,先完成的是系统的主要部分,剩下的增量是持续的把子模块增加到系统里面。
优点:在模块中定位问题比在整个系统之中定位问题更加容易。
敏捷开发模型
敏捷开发模型更强调的是构建和交付。
模块化
模块化意味着把一个大的程序分解成小的、能互相交流的部分。
实现模块化的一些工具
- 结构图
- 类图,例如UML
耦合与内聚
耦合是用来衡量模块之间的相互重叠性的
内聚是用来描述一个模块内部的处理过程的紧密程度的
耦合
Indirect Coupling 非直接耦合
两个模块之间没有直接关系,他们之间的联系完全是通过主模块的控制和调用实现的。
Data Coupling 数据耦合
调用模块和被调用模块之间值传递简单的数据项参数。相当于高级语言中的值传递。
Stamp Coupling 标记耦合
调用模块和被调用模块之间传递数据结构而不是简单数据。
Control Coupling 控制耦合
模块之间传递的不是数据信息,而是控制信息例如标志、开关量等。一个模块控制了另一个模块的功能。
External Coupling 外部耦合
一组模块都访问同一全局简单变量,而且不通过参数表传递该全局变量的信息。
Global Coupling 公共耦合
一组模块都访问同一个全局数据结构。
内聚
Functional Cohesion 功能内聚
模块内所有元素的各个组成部分全部都为完成同一个功能而存在,共同完成一个单一的功能,模块已不可再分
Sequential Cohesion 顺序内聚
一个模块中各个处理元素和同一个功能密切相关,而且这些处理必须顺序执行。通常前一个处理元素的输出是后一个处理元素的输入。
Communicational Cohesion 通信内聚
指模块内所有处理元素都在同一个数据结构上操作或者所有处理功能都通过公用数据而发生关联。
Procedural Cohesion 过程内聚
构件或者操作的组合方式是,允许在调用前面的构件或操作之后,马上调用后面的构件或操作,即使两者之间并没有数据进行传递。
Temporal Cohesion 时间内聚
把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。
Logical Cohesion 逻辑内聚
这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块的参数来确定该模块应完成哪一种功能
Coincidental Cohesion 偶然内聚
一个模块内的各处理元素之间没有任何联系,只是偶然地被凑到了一起。