软件设计基础

软件设计是将用户需求转化为适当形式的过程,有助于程序员进行软件编码和实施。

为了评估用户需求,需要创建 SRS(软件需求规范)文档,而对于编码和实施,则需要更具体、更详细的软件需求。此过程的输出可直接用于编程语言的实施。

软件设计是 SDLC(软件设计生命周期)的第一步,它将重点从问题域转移到解决方案域。它试图指定如何满足 SRS 中提到的要求。

软件设计级别

软件设计产生三个级别的结果:

  • 架构设计 - 架构设计是系统的最高抽象版本。它将软件标识为具有许多相互作用的组件的系统。在此级别,设计师可以了解所提出的解决方案领域。
  • 高级设计 - 高级设计将架构设计的"单一实体-多个组件"概念分解为子系统和模块的抽象程度较低的视图,并描述它们之间的相互作用。高级设计侧重于如何以模块的形式实现系统及其所有组件。它识别每个子系统的模块化结构及其相互之间的关系和相互作用。
  • 详细设计 - 详细设计处理前两种设计中被视为系统及其子系统的实现部分。它更详细地描述模块及其实现。它定义每个模块的逻辑结构及其与其他模块通信的接口。

模块化

模块化是一种将软件系统划分为多个离散且独立的模块的技术,这些模块有望能够独立执行任务。这些模块可以作为整个软件的基本构造。设计人员倾向于将模块设计成可以单独和独立地执行和/或编译。

模块化设计无意中遵循了"分而治之"解决问题策略的规则,这是因为软件的模块化设计还有许多其他好处。

模块化的优势:

  • 较小的组件更易于维护
  • 可以根据功能方面划分程序
  • 可以在程序中引入所需的抽象级别
  • 具有高内聚性的组件可以再次重用
  • 可以实现并发执行
  • 从安全方面来看

并发

回顾过去,所有软件都应按顺序执行。顺序执行的意思是,编码指令将一个接一个地执行,这意味着在任何给定时间只有一部分程序被激活。假设一个软件有多个模块,那么在任何执行时间,所有模块中只有一个处于活动状态。

在软件设计中,并发是通过将软件拆分为多个独立的执行单元(如模块)并并行执行来实现的。换句话说,并发为软件提供了并行执行多个代码部分的能力。

程序员和设计人员有必要识别那些可以并行执行的模块。

示例

文字处理器中的拼写检查功能是软件的一个模块,与文字处理器本身一起运行。

耦合和内聚

当软件程序模块化时,其任务会根据某些特征分为几个模块。众所周知,模块是一组指令,为了完成某些任务而组合在一起。它们虽然被视为单一实体,但可以相互引用以协同工作。有一些措施可以衡量模块设计的质量及其之间的相互作用。这些措施称为耦合和内聚。

内聚

内聚是一种定义模块元素内部依赖程度的度量。内聚力越大,程序设计越好。

内聚力有七种类型,分别是 –

  • 偶然内聚力 - 这是无计划的、随机的内聚力,可能是将程序分解为更小的模块以实现模块化的结果。由于它是无计划的,因此可能会给程序员带来困惑,一般不被接受。
  • 逻辑内聚 - 当按逻辑分类的元素组合成一个模块时,这被称为逻辑内聚。
  • 时间内聚 - 当模块元素被组织成在相似的时间点进行处理时,这被称为时间内聚。
  • 过程内聚 - 当模块元素组合在一起,按顺序执行以完成任务时,这被称为过程内聚。
  • 通信内聚 - 当模块元素组合在一起,按顺序执行并处理相同的数据(信息)时,这被称为通信内聚。
  • 顺序内聚 - 当模块元素被组合在一起,因为一个元素的输出用于作为另一个的输入等等,这被称为顺序内聚。
  • 功能内聚 - 它被认为是最高程度的内聚,并且备受期待。功能内聚中的模块元素被分组,因为它们都对单个定义明确的功能做出贡献。它也可以重复使用。

耦合

耦合是定义程序模块间相互依赖程度的度量。它表明模块在何种程度上相互干扰和交互。耦合度越低,程序越好。

耦合度有五个级别,即 -

  • 内容耦合 - 当一个模块可以直接访问、修改或引用另一个模块的内容时,这称为内容级耦合。
  • 公共耦合 - 当多个模块对某些全局数据具有读写权限时,这称为公共或全局耦合。
  • 控制耦合 - 如果两个模块中的一个决定了另一个模块的功能或改变了其执行流程,则这两个模块被称为控制耦合。
  • 图章耦合 - 当多个模块共享公共数据结构并在其不同部分上工作时,这称为图章耦合。
  • 数据耦合 - 数据耦合是指两个模块通过传递数据(作为参数)相互交互。如果模块将数据结构作为参数传递,则接收模块应使用其所有组件。

理想情况下,没有耦合被认为是最好的。

设计验证

软件设计过程的输出是设计文档、伪代码、详细逻辑图、流程图以及所有功能或非功能需求的详细描述。

下一阶段,即软件的实施,取决于上述所有输出。

然后,在进入下一阶段之前,有必要验证输出。越早发现任何错误越好,否则可能直到产品测试时才被发现。如果设计阶段的输出是正式的符号形式,则应使用其相关的验证工具,否则可以使用彻底的设计审查进行验证和确认。

通过结构化验证方法,审阅者可以发现可能因忽略某些条件而导致的缺陷。良好的设计评审对于良好的软件设计、准确性和质量非常重要。