好多啊,为什么全是这样那样的概念啊,记起来真不容易

总体设计分为两个阶段

  • 系统设计,确定系统的具体实现方案
  • 结构设计,确定软件结构

软件设计过程

软件设计过程——开发阶段的信息流

image-20200804111816667

概要设计/详细设计概念

  • 概要设计:将软件需求转化为数据结构和软件的系统结构,即系统的模块划分。

  • 详细设计:通过对系统的结构表示(每个模块的内部工作)进行细化,得到软件的详细的数据结构和算法。

软件设计原理

模块化

模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。

image-20200804113421251模块化和软件成本

模块化能够提高软件的可修改性。

抽象

现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性),把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。

  • 软件工程过程的每一步都是对软件解法的抽象层次的一次精化

逐步求精

  • 为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。逐步求精是人类解决复杂问题时采用的基本方法,也是许多软件工程技术的基础。

  • 它能帮助软件工程师把精力集中在与当前开发阶段最相关的那些方面上,而忽略那些对整体解决方案来说虽然是必要的,然而目前还不需要考虑的细节。

信息隐藏和局部化

信息隐藏:应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。

**局部化:局部化的概念和信息隐藏概念是密切相关的。所谓局部化是指把一些关系密切的软件元素物理地放得彼此靠近。显然,局部化有助于实现信息隐藏。 **

模块独立

模块独立的概念是模块化、抽象、信息隐藏和局部化概念的直接结果

模块独立程度的两个定性标准度量:

耦合:衡量不同模块彼此间互相依赖(连接)的紧密程度。耦合要低,即每个模块和其他模块之间的关系要简单。

内聚:衡量一个模块内部各个元素彼此结合的紧密程度。内聚要高,每个模块完成一个相对独立的特定子功能。

耦合

  • 数据耦合

  • 控制耦合

  • 特征耦合

  • 公共环境耦合

  • 内容耦合

    一个模块访问另一个模块的内部数据;

    一个模块不通过正常入口转到另一个模块的内部;

    两个模块有一部分程序代码重叠;

    一个模块有多个入口。

耦合是影响软件复杂程度的一个重要因素。

应该采取下述设计原则:

1、尽量使用数据耦合。

2、少用控制耦合和特征耦合。

3、限制公共环境耦合的范围。

4、完全不用内容耦合。

内聚

高内聚:

  • 功能内聚
  • 顺序内聚

中内聚:

  • 通信内聚
  • 过程内聚

低内聚:

  • 时间内聚
  • 逻辑内聚
  • 偶然内聚

启发规则

  • 改变软件结构,增强模块独立性
  • 各个模块的规模要适中
  • 软件结构的深度、宽度、扇出、扇入要适当
  • 模块的作用域应该在控制域之内
  • 力争降低模块接口的复杂程度
  • 设计单入口单出口的模块
  • 模块功能应该可以预测

描绘软件结构的图形工具

层次图

image-20200806222723599

HIPO图

image-20200806222749356

结构图

image-20200806222821821 image-20200806222902247

面向数据流的设计方法

将数据流图转换为软件结构图

img

变换分析

变换分析是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流图按预先确定的模式映射成软件结构。

设计步骤:

(1) 复查基本系统模型

确保系统的输入数据和输出数据符合实际。

(2) 复查并精化数据流图

对需求分析阶段得出的数据流图认真复查,并且在必要时进行精化。

不仅要确保数据流图给出了目标系统的正确的逻辑模型,而且应该使数据流图中每个处理都代表一个规模适中相对独立的子功能。

(3) 确定数据流图具有变换特性还是事务特性

一个系统中的所有信息流都可以认为是变换流,但是,当遇到有明显事务特性的信息流时,建议采用事务分析方法进行设计。确定数据流的全局特性和局部特性。

(4) 确定输入流和输出流的边界,从而孤立出变换中心

输入流和输出流的边界和对它们的解释有关,不同设计人员可能会在流内选取稍微不同的点作为边界的位置。

(5) 完成“第一级分解”

位于软件结构最顶层的控制模块Cm协调下述从属的控制功能:

■输入信息处理控制模块Ca,协调对所有输入数据的接收;

■变换中心控制模块Ct,管理对内部形式的数据的所有操作;

■输出信息处理控制模块Ce,协调输出信息的产生过程。

17YDL8T5L@)MO0JRL5IGKX6.png

(6) 完成“第二级分解”

处理映射成软件结构中一个适当的模块。完成第二级分解的方法是:

■从变换中心的边界开始沿着输入通路向外移动,把输入通路中每个处理映射成软件结构中Ca控制下的一个低层模块;

■然后沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受模块Ce控制的一个低层模块;

■最后把变换中心内的每个处理映射成受Ct控制的一个模块。

TX}1O)8)4VCX%T55A~`O5`S.png J4962N9E{X8XRJ}94BM5FMK.png

(7) 使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化

为了产生合理的分解,得到尽可能高的内聚、尽可能松散的耦合,为了得到一个易于实现、易于测试和易于维护的软件结构,应该对初步分割得到的模块进行再分解或合并。

事务分析

虽然在任何情况下都可以使用变换分析方法设计软件结构,但是在数据流具有明显的事务特点时,也就是有一个明显的“发射中心”(事务中心)时,还是以采用事务分析方法为宜。

事务分析的设计步骤和变换分析的设计步骤大部分相同或类似,主要差别仅在于由数据流图到软件结构的映射方法不同:

■由事务流映射成的软件结构包括一个接收分支和一个发送分支;

■映射出接收分支结构的方法和变换分析映射出输入结构的方法很相像,即从事务中心的边界开始,把沿着接收流通路的处理映射成模块;

■发送分支的结构包含一个调度模块,它控制下层的所有活动模块;然后把数据流图中的每个活动流通路映射成与它的流特征相对应的结构。

HF${SWG%O`FG%PWYVGWCCR7.png

例子

设计一个产品,它将一个文件名作为输入,并返回文件中的字数。

A9VGX~1~}@4QU1YD~DYDX04.png F2YKH2A)P~XVH~@74Q993ZV.png F2YKH2A)P~XVH~@74Q993ZV.png 0(HF%_H5VY7JGC2RCH{1LPH.png

总结:

一般说来,如果数据流不具有显著的事务特点,最好使用变换分析;反之,如果具有明显的事务中心,则应该采用事务分析技术。

机械地遵循变换分析或事务分析的映射规则,可能会得到一些不必要的控制模块,如果它们确实用处不大,那么可以而且应该把它们合并。

如果一个控制模块功能过分复杂,则应该分解为两个或多个控制模块,或者增加中间层次的控制模块。

软件体系结构

软件体系结构的概念

软件体系结构是对子系统和软件的系统构件以及它们之间的相互关系的描述

构件:软件系统的一个封装部分

连接器:构件间的关系

软件体系结构风格的概念

软件系统风格是通过软件系统结构定义了软件系统簇

每种体系风格定义了:

  • 一组构件
  • 一组连接件
  • 约束
  • 语义模型

管道-过滤器风格

构件:过滤器

连接件:管道

数据抽象与面向对象风格

构件:类和对象

连接器:对象之间通过函数调用和消息传递实现交互

隐式调用风格

当一个事件发生,模块中的过程会自动激活

类似qt中的信号和槽

层次系统风格

  • 层次系统(Layerd System)组织成一个层次结构,每一层为上层服务,并作为下层的客户

  • 在一些层次系统中,除了一些精心挑选的 用于输出的函数外,内部的层只对相邻的 外层可见

  • 连接件由决定层间如何交互的协议来定义

  • 拓扑约束是对相邻层间交互的约束

  • 应用例子:分层通信协议、数据库系统、 操作系统……

客户-服务器风格

  • 客户系统请求某个动作或服务,服务器系统 响应该请求。

  • 服务器不必知道客户身份和数目;客户知道 服务器的身份。

  • 基于资源不对等,为实现共享而提出。

三层C/S结构风格:

传统的二层C/S结构的局限:

  • 单一服务器且以局域网为中心,难以扩展至大型企 业广域网Internet。

  • 软、硬件的组合及集成能力有限。

  • 客户端的负荷太重,系统性能容易变坏。

  • 数据安全性不好。

表示层:应用的用户接口部分,担负着用 户与应用间的对话功能;它用于检查用户 从键盘等设备输入的数据,显示应用输出 的数据。(GUI)

功能层:相当于应用的本体,它是将具体 的业务处理逻辑编入程序中。例如,在制 作订购合同时要计算合同金额,按照定好 的格式配置数据、打印订购合同,而处理所需的数据则要从表示层或数据层取得。

数据层:数据库管理系统,负责管理对数据库数据的读写。