软件设计策略



软件设计是一个将软件需求概念化到软件实现的过程。软件设计将用户需求视为挑战,并试图找到最佳解决方案。在软件概念化的过程中,会制定一个计划来找到实现预期解决方案的最佳设计。

软件设计有多种变体。让我们简要学习一下它们。

结构化设计

结构化设计是将问题概念化为几个组织良好的解决方案元素。它主要关注解决方案设计。结构化设计的优势在于,它可以更好地理解如何解决问题。结构化设计还可以使设计人员更准确地专注于问题。

结构化设计主要基于“分而治之”的策略,即将一个问题分解成几个较小的问题,然后分别解决每个小问题,直到解决整个问题。

小问题的解决是通过解决方案模块来实现的。结构化设计强调这些模块应该组织良好,以实现精确的解决方案。

这些模块按层次排列。它们相互通信。良好的结构化设计总是遵循一些模块间通信规则,即:

内聚性 - 将所有功能相关的元素分组。

耦合性 - 不同模块之间的通信。

良好的结构化设计具有高内聚性和低耦合性。

面向函数的设计

在面向函数的设计中,系统由许多称为函数的较小的子系统组成。这些函数能够在系统中执行重要任务。系统被认为是所有函数的顶层视图。

面向函数的设计继承了结构化设计的一些特性,其中使用了分而治之的方法。

这种设计机制将整个系统划分为较小的函数,通过隐藏信息及其操作来提供抽象手段。这些功能模块可以通过传递信息和使用全局可用信息来共享信息。

函数的另一个特性是,当程序调用一个函数时,函数会改变程序的状态,这有时是其他模块无法接受的。面向函数的设计在系统状态无关紧要且程序/函数基于输入而不是状态的情况下效果很好。

设计过程

  • 整个系统被视为数据如何通过数据流图在系统中流动。
  • DFD描述了函数如何改变整个系统的数据和状态。
  • 整个系统根据其在系统中的操作在逻辑上被分解成较小的单元,称为函数。
  • 然后详细描述每个函数。

面向对象的设计

面向对象的设计围绕软件系统中涉及的实体及其特性而不是函数进行工作。这种设计策略侧重于实体及其特性。整个软件解决方案的概念围绕参与的实体展开。

让我们看看面向对象设计的重要概念

  • 对象 - 参与解决方案设计的所有实体都称为对象。例如,人、银行、公司和客户都被视为对象。每个实体都有一些与其相关的属性,并有一些方法可以对属性进行操作。
  • 类 - 类是对对象的概括性描述。对象是类的一个实例。类定义了对象可以具有的所有属性以及定义对象功能的方法。

    在解决方案设计中,属性存储为变量,功能通过方法或过程定义。

  • 封装 - 在OOD中,将属性(数据变量)和方法(对数据的操作)捆绑在一起称为封装。封装不仅将对象的重要的信息捆绑在一起,而且还限制了外部世界对数据和方法的访问。这称为信息隐藏。
  • 继承 - OOD允许类似的类以层次结构的方式堆叠起来,其中下级或子类可以导入、实现和重用其直接父类的允许变量和方法。OOD的此属性称为继承。这使得定义特定类和从特定类创建泛化类更容易。
  • 多态性 - OOD语言提供了一种机制,其中执行类似任务但参数不同的方法可以分配相同的名称。这称为多态性,它允许单个接口为不同类型执行任务。根据函数的调用方式,代码的相应部分将被执行。

设计过程

软件设计过程可以被视为一系列明确定义的步骤。虽然它根据设计方法(面向函数或面向对象)而有所不同,但它可能涉及以下步骤:

  • 根据需求或先前使用的系统和/或系统序列图创建解决方案设计。
  • 根据属性特征的相似性识别对象并将其分组到类中。
  • 定义类层次结构及其之间的关系。
  • 定义应用程序框架。

软件设计方法

以下是两种通用的软件设计方法

自顶向下设计

我们知道,一个系统由多个子系统组成,它包含许多组件。此外,这些子系统和组件可能拥有自己的子系统和组件集,并在系统中创建层次结构。

自顶向下设计将整个软件系统作为一个实体,然后根据某些特征将其分解为多个子系统或组件。然后将每个子系统或组件视为一个系统,并进一步分解。这个过程持续进行,直到达到自顶向下层次结构中的系统最低级别。

自顶向下设计从系统的通用模型开始,并不断定义其更具体的方面。当所有组件组合在一起时,整个系统就产生了。

当软件解决方案需要从头开始设计并且具体的细节未知时,自顶向下设计更合适。

自底向上设计

自底向上设计模型从最具体和最基本的组件开始。它通过使用基本或较低级别的组件来构建更高级别的组件。它不断创建更高级别的组件,直到期望的系统不作为单个组件演变。随着每个更高级别,抽象的量增加。

当需要从一些现有系统创建系统时,自底向上策略更合适,其中基本原语可以在新系统中使用。

自顶向下和自底向上方法单独使用都不实用。相反,两者良好的组合被使用。

广告