- 软件工程教程
- 软件工程首页
- 软件工程概述
- 软件开发生命周期
- 软件项目管理
- 软件需求
- 软件设计基础
- 分析与设计工具
- 软件设计策略
- 软件用户界面设计
- 软件设计复杂性
- 软件实现
- 软件测试概述
- 软件维护
- CASE工具概述
- 软件考试题及答案
- 软件工程考试题及答案
软件设计基础
软件设计是一个将用户需求转化为某种合适形式的过程,这有助于程序员进行软件编码和实现。
为了评估用户需求,会创建SRS(软件需求规格说明)文档;而对于编码和实现,则需要以软件术语表达更具体和详细的需求。此过程的输出可以直接用于编程语言的实现。
软件设计是SDLC(软件开发生命周期)的第一步,它将注意力从问题域转移到解决方案域。它试图指定如何满足SRS中提到的需求。
软件设计层次
软件设计产生三个层次的结果
- 架构设计 - 架构设计是系统最高层次的抽象版本。它将软件识别为一个由许多相互交互的组件组成的系统。在这个层次上,设计人员可以了解拟议的解决方案域。
- 高层设计 - 高层设计将架构设计中“单个实体-多个组件”的概念分解为子系统和模块的较低抽象视图,并描述它们之间的相互作用。高层设计侧重于如何以模块的形式实现系统及其所有组件。它识别每个子系统的模块化结构以及它们彼此之间的关系和交互。
- 详细设计 - 详细设计处理在前两个设计中被视为系统及其子系统的实现部分。它对模块及其实现更详细。它定义每个模块的逻辑结构及其与其他模块通信的接口。
模块化
模块化是一种将软件系统划分为多个离散且独立的模块的技术,这些模块预计能够独立执行任务。这些模块可以作为整个软件的基本构造。设计人员倾向于设计模块,以便可以单独且独立地执行和/或编译它们。
模块化设计无意中遵循了“分而治之”的解决问题策略的规则,这是因为模块化软件设计还有许多其他好处。
模块化的优点
- 较小的组件更容易维护
- 程序可以根据功能方面进行划分
- 可以在程序中引入所需的抽象级别
- 具有高内聚性的组件可以再次重用
- 可以实现并发执行
- 从安全角度来看是理想的
并发性
过去,所有软件都旨在顺序执行。顺序执行是指编码指令将一个接一个地执行,这意味着任何给定时间只有一个程序部分被激活。例如,如果软件有多个模块,则在任何执行时间都只能找到一个模块处于活动状态。
在软件设计中,并发性是通过将软件拆分为多个独立的执行单元(如模块)并并行执行它们来实现的。换句话说,并发性为软件提供了并行执行多个代码部分的能力。
程序员和设计人员有必要识别哪些模块可以进行并行执行。
示例
文字处理程序中的拼写检查功能是一个软件模块,它与文字处理程序本身一起运行。
耦合和内聚
当软件程序模块化时,其任务将根据某些特征划分为多个模块。众所周知,模块是一组指令,为了完成某些任务而组合在一起。它们虽然被认为是单个实体,但可以相互引用以一起工作。有一些度量可以衡量模块设计及其相互作用的质量。这些度量称为耦合和内聚。
内聚
内聚是一种度量,它定义了模块元素内部依赖性的程度。内聚性越高,程序设计越好。
共有七种类型的内聚,即:
- 偶然内聚 - 这是未计划的和随机的内聚,可能是为了模块化的目的将程序分解成较小模块的结果。因为它未经计划,所以可能会让程序员感到困惑,通常不被接受。
- 逻辑内聚 - 当逻辑分类的元素组合到一个模块中时,称为逻辑内聚。
- 时间内聚 - 当模块的元素被组织起来以便在相似的点进行处理时,称为时间内聚。
- 过程内聚 - 当模块的元素组合在一起,并且为了执行任务而顺序执行时,称为过程内聚。
- 通信内聚 - 当模块的元素组合在一起,并且顺序执行并在相同的数据(信息)上工作时,称为通信内聚。
- 顺序内聚 - 当模块的元素组合在一起是因为一个元素的输出作为另一个元素的输入,依此类推时,称为顺序内聚。
- 功能内聚 - 这被认为是最高程度的内聚,并且非常期望。功能内聚中模块的元素组合在一起,因为它们都对单个明确定义的功能做出了贡献。它也可以重用。
耦合
耦合是一种度量,它定义了程序模块之间相互依赖的级别。它说明了模块以什么级别相互干扰和交互。耦合越低,程序越好。
共有五个级别的耦合,即:
- 内容耦合 - 当一个模块可以直接访问、修改或引用另一个模块的内容时,称为内容级耦合。
- 公共耦合 - 当多个模块具有对某些全局数据的读写访问权限时,称为公共或全局耦合。
- 控制耦合 - 如果一个模块决定另一个模块的功能或改变其执行流程,则这两个模块称为控制耦合。
- 标记耦合 - 当多个模块共享公共数据结构并在其不同部分工作时,称为标记耦合。
- 数据耦合 - 数据耦合是指两个模块通过传递数据(作为参数)来相互交互。如果一个模块传递数据结构作为参数,则接收模块应该使用其所有组件。
理想情况下,无耦合被认为是最好的。
设计验证
软件设计过程的输出是设计文档、伪代码、详细逻辑图、流程图以及所有功能或非功能需求的详细描述。
下一个阶段是软件的实现,它取决于上述所有输出。
因此,在进入下一阶段之前,有必要验证输出。越早检测到错误越好,否则可能直到产品测试时才能检测到。如果设计阶段的输出是正式表示形式,则应使用其相关的验证工具;否则,可以使用彻底的设计审查来进行验证。
通过结构化验证方法,审查人员可以检测可能因忽略某些条件而导致的缺陷。良好的设计审查对于良好的软件设计、准确性和质量至关重要。