📜  软件设计基础

📅  最后修改于: 2021-01-07 06:23:38             🧑  作者: Mango


软件设计是将用户需求转换为某种合适形式的过程,可帮助程序员进行软件编码和实现。

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

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

软件设计水平

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

  • 建筑设计-建筑设计是系统的最高抽象版本。它将软件标识为具有许多相互交互的组件的系统。在这个级别上,设计人员可以想到提议的解决方案领域。
  • 高级设计-高级设计将体系结构设计的“单个实体-多个组件”概念分解为对子系统和模块的抽象视图,并描述了它们之间的相互作用。高级设计着重于如何以模块形式实现系统及其所有组件。它识别每个子系统的模块化结构以及它们之间的关系和交互。
  • 详细设计-详细设计处理在前两个设计中被视为系统及其子系统的实现部分。有关模块及其实现的详细信息。它定义了每个模块的逻辑结构及其与其他模块进行通信的接口。

模块化

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

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

模块化的优势:

  • 较小的组件更易于维护
  • 程序可以根据功能方面进行划分
  • 可以在程序中引入所需的抽象级别
  • 内聚性高的组件可以再次使用
  • 可以并发执行
  • 从安全角度考虑

并发

时光倒流,所有软件都应按顺序执行。通过顺序执行,我们的意思是编码指令将一个接一个地执行,这意味着在任何给定时间仅激活了程序的一部分。假设一个软件具有多个模块,那么在任何执行时间都只能发现所有模块中的一个处于活动状态。

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

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

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

耦合与内聚

将软件程序模块化后,其任务将根据某些特性分为几个模块。众所周知,模块是为了完成某些任务而组合在一起的一组指令。尽管它们被视为单个实体,但可以相互参照以一起工作。有一些方法可以衡量模块设计的质量以及它们之间的相互作用。这些措施称为耦合和内聚。

凝聚

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

凝聚力有七种类型,即–

  • 偶然的内聚-这是计划外的和随机的内聚,这可能是出于模块化目的将程序分成较小的模块的结果。由于它是计划外的,因此可能会使程序员感到困惑,并且通常不被接受。
  • 逻辑内聚力-将按逻辑分类的元素放到一个模块中时,这称为逻辑内聚力。
  • 时间内聚-组织模块的元素以便在相似的时间点对它们进行处理时,这称为时间内聚。
  • 程序内聚-将模块的元素分组在一起并顺序执行以执行任务时,这称为程序内聚。
  • 沟通凝聚力-当模块的元素组合在一起时,它们依次执行并处理相同的数据(信息),这称为沟通凝聚力。
  • 顺序内聚-由于一个元素的输出充当另一个元素的输入,因此将模块的元素分组时,依此类推,这称为顺序内聚。
  • 功能性内聚力-被认为是最高的内聚力,并且是高度期望的。功能内聚中的模块元素归为一组,因为它们都有助于一个明确定义的函数。也可以重用。

耦合

耦合是一种定义程序模块之间相互依赖程度的度量。它告诉模块在什么级别上相互干扰和交互。耦合越小,程序越好。

耦合有五个级别,即-

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

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

设计验证

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

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

然后有必要在进行下一阶段之前验证输出。尽早发现任何错误,发现情况会更好,或者直到测试产品后才可能发现。如果设计阶段的输出采用正式符号形式,则应使用其相关的验证工具,否则可以使用全面的设计审查进行验证和确认。

通过结构化的验证方法,审阅者可以检测到由于忽略某些情况而可能导致的缺陷。好的设计审查对于好的软件设计,准确性和质量很重要。