4.1软件设计

软件设计

在软件生命周期中:

分析 —— 设计 —— 编码 —— 测试 —— 维护

软件设计的定义

  • 软件系统或组件的架构、构件、接口和其他特性的定义过程及该过程的结果。

    • 是连接用户需求和软件技术的桥梁

    • 即:用户需求——>软件设计——>软件技术

设计工程活动分类,描述软件的概貌与细节

软件架构设计(有时称为顶层设计)

  • 描述软件的顶层架构和组织,划分不同的组件

软件详细设计

  • 详细描述各组件以便能够编码实现

设计过程分类:

  • 软件设计主要为分解设计D-design(Decomposition design),也就是将软件映射为各组件;

  • 可以少部分包括系列模式设计FP-design(Family Pattern design),可以帮助我们提高相似组件的可复用性

设计模型

模型输入

之前在软件需求阶段监理的数据模型、功能模型和行为模型

此阶段要建立的设计模型分类

数据设计 、架构设计 、接口设计 、组件设计

分析模型到设计模型的转化

部分分析模型所得到的结果与设计模型四部分的对应关系如图所示。

一种分析模型的结果可能会对多个设计模型产生影响,比如类图中类的属性和类间关系对数据的设计、类的操作对构件级的设计都会产生非常大的影响。

反过来,一个设计模型也有可能受到多个分析模型的影响,比如接口的设计会参考顺序图对象之间的消息交互,也会参考用例之间的关系类型。

软件设计质量

好的设计应该具有如下三个特点:

  1. 第一,正确的承上,也就是说正确传递分析模型的结果;
  2. 第二,正确的启下,即是说对软件开发后续过程的进行是有帮助的,对编码人员、测试人员及后续的维护人员是可读可理解的;
  3. 第三,从实现的角度给软件一个完整的说明,通过设计方案能够准确的预期未来的产品形态。

设计质量属性

从以下方面衡量:

  • 功能性,指的是软件的功能要完整,符合用户的预期。
  • 易用性,指的是软件要好用,界面对用户友好。
  • 可靠性,是指软件不易出错,运行稳定。
  • 性能,主要是指软件的吞吐率和响应时间等等,能运行而且运行流畅。
  • 可支持性,又包含三个属性:扩展性、适应性和可维护性。扩展性是指软件添加新的功能或升级已有功能是否方便;适应性是指软件适应新的环境、新的变化是否容易;
  • 可维护性,是指程序代码是否易懂、软件维护期间的成本是否更小等等。

设计指导原则

  • 设计应该先制作架构,先勾勒全貌,不能一开始就跳入细节。
  • 设计应该是模块化的,把大问题分解为小问题
  • 设计应该包含四个方面:数据、体系结构、接口和组件
  • 注意导出的设计模块的可复用性
  • 设计结果要简单易懂,切忌追求复杂的画图技巧。

设计相关的八大概念

  1. 抽象
  2. 体系结构
  3. 设计模式
  4. 模块化
  5. 信息隐藏
  6. 功能独立
  7. 精化
  8. 重构

其中:“信息隐藏”,它同时也是一个信息安全领域的概念,与信息的保密性和完整性有关,而在软件工程里的信息隐藏,主要是指把细节信息隐藏在接口之后,切勿混淆。

1·抽象

抽象是指从不同的东西里找相同点,也就是透过现象看本质。

分类:数据抽象、过程抽象。例如“开”、“门”

2·体系结构

•定义:软件的整体结构

•体系结构设计可以使用大量的一种或多种模型来表达

​ •结构模型

​ •框架模型

​ •动态模型

​ •过程模型

​ •功能模型

3·设计模式

在给定上下文环境中一类共同问题的共同解决方案

•实体模式

•结构模式

•行为模式

设计模式举例——抽象工厂

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

这里我仅以抽象工厂作为一个设计模式来举例说明其作用。工厂1和工厂2都可以生产产品A和产品B,但生产的工艺流程是不同的。作为顾客来说,我想得到产品A或B,但我并不关心是由工厂1还是工厂2来生产这个产品,我只关心最终结果而不是过程。所以我们就可以采取如图所示的方案,用工厂接口和产品接口去屏蔽实现的细节。

4· 模块化

•软件被划分为命名和功能相对独立的多个组件(通常称为模块),通过这些组件的集成来满足问题的需求

模块化,指的是将软件划分成为多个不同的组件来实现和管理。听起来很简单,可是这些模块也不能随意的切分,要考虑让他们尽量的相对独立;而且也不能够无限度的划分下去,并不是模块分的越细越好。关于模块化的理论依据是基于人类解决问题的观测数据。

模块化和软件成本

问题:如何确定最小代价区间M ??

如图所示,随着模块个数的增多,模块的成本在不断的降低,而模块之间的集成成本则在不断的升高。你可以理解为,模块划分的越细,单个模块所需要的代码行数就越少,但调度这些模块所需的代码就越来越多。在模块个数较少时,模块成本的降低对总成本的影响较大,而当模块个数足够多时,模块集成的成本对总成本的影响较大,所以,模块的个数会存在一个最合理的最小代价区间。

模块化设计标准

  1. 模块化的分解性:可分解为子问题
  2. 模块化的组合性:组装可重用的组件
  3. 模块化的可理解性:可作为独立单元理解
  4. 模块化的连续性:需求小变化只影响单个模块
  5. 模块化的保护:模块内异常只影响自身

5·信息隐藏

信息隐藏的原则是指,模块定义和设计时应该保证模块内的信息不可以被不需要这些信息的其他模块访问。模块与模块之间就像黑盒。

模块化基本问题 如何分解软件系统以达最佳的模块划分

信息隐藏原则

模块应该具有彼此相互隐藏的特性

•即:模块定义和设计时应当保证模块内的信息(过程和数据)不可以被不需要这些信息的其他模块访问

特点

•抽象有助于定义构成软件的过程(或信息)实体。

•信息隐藏原则定义和隐藏了模块内的过程细节和模块内的本地数据结构。

6·功能独立

每个模块只负责需求中特定的子功能,并且从程序结构的其他部分看,该模块具有简单的接

好处

  • 易于开发:功能被划分,接口被简化
  • 易于维护(和测试)︰次生影响有限,错误传递减少,模块重用定性衡量标准
  • 内聚性:模块的功能相对强度·耦合性:模块之间的相互依赖程度·模块独立性强=高内聚低耦合

7·精化

精化就是逐步求精的过程,它与抽象的概念相反。抽象是不拘泥于底层的细节,提炼出相同的过程和数据;而精化是让设计者在设计过程中逐步揭示底层的细节。

与抽象的关系

  • 抽象使设计师确定过程和数据,但不局限于底层细节

  • 精化有助于设计者在设计过程中揭示底层细节

8·重构

不改变组件功能和行为条件下,简化组件设计(或代码)的一种重组技术

方法

检查现有设计的冗余情况、未使用的设计元素、无效或不必要的算法、较差的构建方式或不恰当的数据结构,或任何其他可被更改从而优化设计的问题。它与功能性无关,但能够提高程序后期的可维护性。

设计技术概要

  1. 数据设计,数据是软件要操纵和维护的信息对象,没有了数据,软件的运行将没有意义。
  2. 架构设计,就像房子的框架结构设计一样,表明软件的总体结构。
  3. 接口设计,不同的组件之间一定要有适配的插头和插座,而且接口连接了系统不同的组成部分。
  4. 组件设计,它也是最重要的,因为功能的实现主要在组件内部完成。

1、数据设计

含义

​ 数据设计(数据架构)用来构建高层抽象(客户/用户的数据视图)的数据模型、信息模型

相关概念

•数据建模 (数据字典、E-R图、类图)

•数据结构 (计算机存储和组织数据的方式)

•数据库 (基于数据结构来组织存储和管理数据的方式)

•数据仓库 (数据仓库是更大规模的特殊组织的数据库)

概念数据模型

数据模型的设计也是从粗到精,从抽象到具体的。比如,概念数据模型属于高层的抽象模型,它可以由ER图来表示,这里只是对实体以及实体之间的关系进行了说明。

物理数据模型

而低层的具体的物理数据模型,则需要结合具体的数据库与数据结构来定义。

2、软件体系结构

程序或计算系统的软件体系结构是指系统的一个或多个结构,它包括软件构件、构件的外部可见属性以及它们之间的相互关系

注意:体系结构并非可运行的软件

•体系结构和设计

设计是体系结构的一个实例

例:客户机服务器体系结构,可对应Java EE或.NET设计框架

功能

体系结构并非可运行的软件,使你能够

  1. 对设计在满足既定需求方面的有效性进行分析;
  2. 在设计变更相对容易的阶段,考虑体系结构可能的选择方案;
  3. 降低与软件构建相关的风险

体系结构类型

•人工智能、通信、设备、金融、游戏、工业、法律、医疗、军事、操作系统、运输、实用程序以及许多其他类型

体系结构风格

•建筑师使用体系结构风格作为描述手段,将不同风格(框架、砖瓦、鳕鱼角式)的房子区分开来

•软件体系结构风格就是施加在整个系统设计上的一种变换,目的是为系统的所有构件建立一个结构。例:Client/Server模式

体系结构设计

  1. 系统需要执行的函数功能组件集(比如数据库有哪些表、程序有哪些类
  2. 组件之间通信、协同和合作的连接器(比如如何让一个类从数据库里获取数据
  3. 组件集成构成系统的约束(比如集成之后不同层次的类能否随意访问)
  4. 整体特性的语义模型分析。我们经常会基于一些成熟的体系结构框架来搭建自己的体系结构。

风格和模式分类

1· 数据中心架构

含义:

以数据为中心的架构,在这个架构里,数据存储是整个应用程序的中心,所有的客户端软件相互之间没有交互,只能通过与数据存储交互来实现信息的共享。如:数据库系统;超文本系统;

2·数据流体系架构

分类

  1. 过滤器:过滤器通过管道相互连接,管道的输入是前一个过滤器的输出,管道的输出是后一个过滤器的输入,通过过滤器对数据的加工实现程序的功能。如:图像处理;音视频处理
  2. 批处理序列:过滤器严格按照预定的时间顺序从前往后执行。如:程序编译

3·调用和返回架构

含义:

调用和返回架构是类似于树形的结构。整个程序从根模块开始,通过调用其子模块,而子模块再去调用其下级模块,并分别向上返回结果,来实现程序功能。如:“主程序/子程序”模式(这是我们学语言最早遇到的结构)。

4·层次架构

含义:

层次架构,将软件从外到内,分为了很多层。如:操作系统

5· 面向对象架构

含义:MVC架构

  1. 由模型(MODEL)、视图(VIEW)和控制器(CONTROLLER)组成
  2. 模型用于管理数据对象,视图用于界面表示,控制器用于响应视图请求并更新模型与视图。
  3. 系统组件封装数据和处理该数据的操作。
  4. 组件之间的通信和协作通过消息传递实现 。

体系结构组织与细化

两个基本问题

控制结构

​ •在架构内部如何实现管理控制?是否有不同的控制架构存在?

数据传递

​ •组件之间如何进行数据传递?数据流是否连续,或者传递给系统的数据对象是否零散?

3、接口设计(含界面设计)

接口设计其实包含内部接口的设计与外部接口的设计两个方面。

•高效用户界面设计有三条重要原则

  1. 允许用户操作控制(用户为中心)

  2. 减少用户记忆负担

  3. 保持界面一致

4、组件设计

构件

系统中模块化的、可部署的和可替换的部件,该部件封装了实现并对外提供一组接口

组件

组件(Component)是对数据和方法的简单封装

分类

•面向过程的组件设计——函数与模块的设计

•面向对象的组件设计——类与操作的设计

部署设计

•以部署环境创建开始,在整个生命周期阶段中处于逻辑设计和技术需求阶段

posted @   Dinesaw  阅读(926)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示