软件设计基础 – 软件工程教程

上一章软件工程教程请查看:软件需求

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

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

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

软件设计水平

软件设计产生三个层次的结果:

  • 体系结构设计——体系结构设计是系统的最高抽象版本。它将软件标识为一个具有许多相互交互的组件的系统。在这个层次上,设计者得到了被提议的解决方案域的思想。
  • 高级设计——高级设计将架构设计的“单一实体-多个组件”概念分解为抽象较少的子系统和模块视图,并描述它们之间的交互。高级设计关注的是如何以模块的形式实现系统及其所有组件。它识别各子系统的模块结构及其相互之间的关系和相互作用。
  • 详细设计——详细设计处理前两个设计中被视为系统及其子系统的实现部分。它更详细地介绍了模块及其实现。它定义了每个模块的逻辑结构及其与其他模块通信的接口。

模块化

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

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

模块化的优势:

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

并发性

在过去,所有的软件都是按顺序执行的。我们所说的顺序执行是指编码指令将一个接一个地执行,这意味着在任何给定的时间内,程序只有一部分是被激活的。例如,一个软件有多个模块,那么在执行的任何时候,所有模块中只有一个是活动的。

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

对于程序员和设计人员来说,识别这些可以并行执行的模块是很有必要的。

例子

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

耦合和内聚

当一个软件程序被模块化时,它的任务根据一些特征被分成几个模块。我们知道,模块是为了完成某些任务而组合在一起的指令集。尽管它们被认为是一个单独的实体,但它们可以相互引用以共同工作。模块的设计质量和模块之间的交互可以通过一些度量来度量。这些措施称为耦合和内聚。

内聚

内聚是定义模块元素内部可靠性程度的度量。凝聚力越大,程序设计就越好。

衔接有七种类型,即-

  • 同时发生的内聚——它是计划外的和随机的内聚,这可能是为了模块化而将程序分解成更小的模块的结果。因为它是计划外的,它可能会使程序员感到困惑,并且通常不被接受。
  • 逻辑内聚——将逻辑分类的元素放在一个模块中,称为逻辑内聚。
  • 时间内聚——当模块的元素被组织起来,并在类似的时间点进行处理时,就称为时间内聚。
  • 过程内聚——当模块的元素被组合在一起,为了执行一个任务而依次执行时,它被称为过程内聚。
  • 通信内聚——当模块的元素被分组在一起,按顺序执行并处理相同的数据(信息)时,就称为通信内聚。
  • 顺序内聚——当模块的元素被分组,因为一个元素的输出作为另一个元素的输入等等,它被称为顺序内聚。
  • 功能衔接——它被认为是最高程度的衔接,人们对它的期望很高。功能内聚中的模块元素被分组,因为它们都对一个定义良好的函数有贡献。它也可以重复使用。

耦合

耦合是一种度量,它定义了程序模块之间的相互依赖程度。它告诉在什么水平上模块相互干扰和相互作用。耦合越低,程序越好。

有五层耦合,即-

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

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

设计验证

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

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

在进入下一阶段之前,有必要对输出进行验证。任何错误检测得越早,就越好,否则在产品测试之前可能无法检测到。如果设计阶段的输出是正式的符号形式,那么应该使用它们相关的验证工具,否则可以使用一个完整的设计评审来验证和确认。

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

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?