软件工程【三】

二、结构化设计(续)


1、结构化设计的概念与原理

传统软件工程方法学采用结构化设计技术(SD)。从工程管理角度结构化设计分两步:

①概要设计: 将软件需求转化为数据结构和软件系统结构。

②详细设计: 过程设计,通过对结构细化,得到软件详细数据结构和算法。

结构化设计与分析的关系:

  • 数据设计:数据模型及核心数据字典转变为数据结构。
  • 体系结构设计:功能模型中数据流图转变成计算机模块框架。
  • 接口设计:功能模型中数据流图转变成软件内部、软件与协作系统间、软件与用户间通信方式。
  • 过程设计:行为模型及功能模型中的“处理规格说明”转换成软件构件过程描述。

(1)结构化设计的概念与原理-模块化

“模块“又称”构件”一般指用一个名字调用的相邻程序元素序列。

模块化设计(modular design): 按适当的原则把软件划分为一个个较小的、相关而又相对独立的模块。

但是不能无限划分,接口成本会增加

(2)结构化设计的概念与原理-抽象

奇妙的数字 7±2,是人类信息处理能力的限度,不能同时考虑所有细节。所以我们需要抽象,抽象就是抽出事物的本质特性,暂不考虑细节。

(3)结构化设计的概念与原理-求精

求精是指为了能集中精力解决主要问题,尽量推迟对细节问题的考虑,实际上是一个细化过程,与抽象是互补的概念。(就是将抽象细化,将实现的细节添加进去)

抽象使得设计者能够说明过程和数据,同时却忽略底层细节;

求精帮助设计者在设计过程中揭示底层细节。

(4)结构化设计的概念与原理-信息隐藏

每个模块的实现细节对于其他模块来说是隐藏的也就是说,模块中所包含的信息是不允许其他不需要这些信息的模块访问的。

每个客户只能通过接口来了解该模块,而所有的实现都隐蔽起来。

(5)结构化设计的概念与原理-模块独立

模块独立:具有独立功能且和其他模块没过多作用。

理由:

  • 1.容易分工合作
  • 2.容易测试和维护,修改工作量较小,错误传播范围小,扩充功能容易

两个定性度量标准:耦合和内聚。

2、模块独立

(1)耦合

原则:尽量使用数据耦合,少用控制耦合,限制公共环境耦合, 完全不用内容耦合。

耦合是软件结构中不同模块间互连程度度量。取决模块间接口复杂程度,通过接口数据。追求尽可能松散耦合系统。

  • 非直接耦合:两个模块分别能独立地工作不需要另一模块存在。
  • 数据耦合:两模块通过参数交换数据信息。即A的结果只作为B的一个处理数据参与。
  • 控制耦合:两模块通过参数交换控制信息(包括数字形式)。即A的结果能够决定B的运行进程选择。
  • 公共环境耦合:两个或多个模块通过一公共数据环境作用。这个公共环境可以是全局变量、共享通信区、存储介质上的文件、物理设备等具有两种可能
    • (1)一模块送数据,另一模块取,等价数据耦合。
    • (2)两模块既往公共环境送又从里面取,介于数据耦合和控制耦合之间。
  • 内容耦合
    • (1)一模块访问另一模块内部数据;
    • (2)一模块不通过正常入口转到另一模块内部;
    • (3)两模块有部分程序代码重叠(汇编程序);
    • (4)一模块有多个入口。

(2)内聚

内聚是模块内各元素彼此结合紧密程度。

  • 功能内聚:一模块中各部分是完成某一功能必不可少组成部分。
  • 顺序内聚:模块内处理元素同某功能密切相关,顺序执行。
  • 通信内聚: 一模块内各功能部分都使用相同输入数据,或产生相同输出数据。
    • 例如:在“获得配件单价和库存单”模块,产生配件单价和库存单都是使用的配件编号。
  • 过程内聚:模块内处理元素相关,特定次序执行。如把流程图中循环部分、判定部分、计算部分分成三个模块,这三个模块都是过程内聚模块。
    • 例:在该模块中由于累计销售额和累计订货量都能够在一个循环中计算,过程内聚。
  • 时间内聚:多为多功能模块,要求所有功能在同一时间内执行。如初始化模块和终止模块及紧急故障处理模块。
    • 强调模块内处理的元素只是在时间上具有强烈的关联性,所以一般只是在初始化和终止中使用
  • 逻辑内聚:一模块完成功能在逻辑上属相同相似一类。
  • 偶然内聚:模块内各部分间没有联系,即使有也很松散。
    • 例如,A:把记录号放入N、B:从主文件读取信息、C:X+1三个模块功能调用很简单,就放在一个模块M中,于是这个模块中很多语句互不干系,只是看A、B、C的调用决定使用哪一块。

从上往下内聚度逐渐减少。功能内聚>顺序内聚>通信内聚>过程内聚>时间内聚>逻辑内聚>偶然内聚。过程内聚和时间内聚尽量少用。逻辑内聚和偶然内疚尽量不要出现。

3、启发规则

启发规则是一些前辈归纳的对设计软件由帮助的规则。

(1)改进软件结构提高模块独立性

初步结构分解或合并,降低耦合提高内聚。

将两个模块中相似的部分做成一个模块,复用代码。提高内聚,降低耦合

(2)模块规模应该适中

过大分解不充分,但进一步分解不应降低模块独立性。 过小开销大于有效操作,模块数目过多系统接口复杂。 通常语句行数在50~100(一页纸),最多不超过500行。

(3)深度、宽度、扇出和扇入应适当

  • 深度:软件结构控制层数,标志一系统大小和复杂程度。
  • 宽度:软件结构同一层模块数最大值,越大系统越复杂。
  • 扇出:一模块直接控制(调用)模块数,过大,模块复杂,过小(如1)不好。3-9。
    • 扇出过了怎么办?将扇出的模块观察联系再分类,增加中间层模块
  • 扇入:有多少上级模块直接调用它,越大共享该模块上级模块越多。
    • 扇入过了怎么办?同样的,将扇入的模块观察联系再分类,增加中间层模块

例如:深度5宽度7

改善高扇出软件结构示例:

改善后:

(4)模块作用域应在控制域内

  • 作用域:受该模块内判定影响的所有模块集合。
  • 控制域:模块本身及所有直接或间接从属它的模块集合。
  • 若模块作用域不在控制域内,会增大模块间控制耦合。
  • 改善作用域不在控制域的软件结构
    • 方法一:移动判定点
    • 方法二:移动作用域

改善作用域不在控制域的软件结构图:

方法一:移动判定点

方法二:移动作用域

(5)降低模块接口复杂程度

模块接口复杂是软件发生错误一主要原因。应使信息传递简单且和模块功能一致。

例如:一个处理一元二次方程的函数,AX2+BX+C=0,A,B,C,X1,X2分别作为函数的参数就不如A、B、C放入一个数组X1、X2放入一个数组进行传递好

(6)设计单入口、单出口模块

尽量保证上层进入下层输出

(7)模块功能可预测

  • 输入数据相同,产生同样输出。
  • 模块功能防止过分受限。
    • 客户说10个字符以内,你就设计10字符以内吗?以后有新的高需求了就得推到重来

不可预测模块:

不可预测的模块,不能够进行测试,你无法知道输入数据对应的输出是什么。

4、面向数据流设计方法

面向数据流的设计要解决的任务,就是将软件需求分析阶段生成的逻辑模型数据流图映射(Mapping)表
达软件系统结构的软件结构图结构化设计属于面向数据流的设计方法。

(1)软件结构图

默认就是上调用下,不需要箭头。数据信号空心圆圈表示,控制信号实心圆圈表示。判断调用使用菱形,循环调用使用带箭头的弧线

(2)信息流类型

  • 1.变换流信息沿输入通路进入系统,由外部形式变换成内部形式,通过变换中心加工处理后再沿输出通路变换成外部形式离开软件系统。
  • 2.事务流 信息沿输入通路到一处理,由处理根据输入信息类型在若干动作序列中选一个执行。处理称事务中心,它接收输入信息(又称事务)、分析每个事务确定类型、根据事务类型选取一活动通路。是事务流的最明显的特征。

(3)变换流分析实例

例:软件做在只读存储器中,使设备具有某些“智能”。假设的仪表板将完成下述功能:
(1)通过模/数转换实现传感器和微处理机接口;
(2)在发光二极管面板上显示数据;
(3)指示每小时英里数(mile/h)、行驶里程和每加仑油行驶的英里数(mile/Gal)等;
(4)指示加速或减速
(5)超速警告:发出超速警告铃声。

1.复查基本系统模型。确保系统输入和输出数据符合实际。

2.复查并精化数据流图。因为我们在转换成为模块表示的软件结构图时,数据流图的某些部分可能过大或者顺序不利于编程等,不利于实现。我们需要侧向方便软件实现的现实进一步复查并精化数据流图,正确、处理项完成相对独立功能。

最终得到数字仪表板系统数据流图如下:

3.确定数据流图具有变换特性还是事务特性。没有明显事务中心(一进然后判断多出的一个进行处理。),则为变换型。

4.通过划分数据流边界找出变换中心

  • ①输入边界:输入数据流向中心推。判断输入数据是变成了输入数据的某种形式还是变成了输出。如果数据流经过了某个处理还是输入数据的某种形式那么边界就推过这个处理,否则停止。
  • ②输出边界:位于产生最终输出的处理之前。
  • 结果:

5.通过划分的数据流边界完成一级分解

6.完成第二级分解

  • 对每个输入结构,逆向细分调用。
  • 对变换结构同理
  • 对变换结构同理

7.对初步软件结构精化

为了软件设计方便,进行进一步细化精化。

(4)事物流分析实例

软件结构:一接收分支和一发送分支。

(4)面向数据流设计过程总览

  • 注意启发式设计规则来精化软件结构
  • 不断复查、细化
  • 分析出变换流和事务流之前,两者工作相同

5、人机界面设计

(1)常见问题

  • 1.系统响应时间
    • 用户觉得系统立即响应时间范围0.1-1秒,超出1秒会让用户注意到延迟
    • 1-10 秒 鼠 标 显 示 成 为 沙 漏
    • 10 到18 秒 由微帮助来显示处理进度
    • 18 秒 以 上 显示处理窗口,或显示进度条
    • 但响应时间也不能过短,因为这样会短迫使用户加快操作节奏,导致出错。
    • 易变性:易变性指响应时间相对平均响应时间偏差,越低越好,否则会让用户误认为系统工作异常。
  • 2.用户帮助措施
    • 手册和联机帮助(不离开用户界面)。
    • 联机帮助两类:集成帮助和附加帮助。集成帮助设计在软件里面,附加帮助系统建成后加到软件
      中,前者可用性更强。
    • 请求帮助:帮助菜单,特殊功能键,HELP 命令。
    • 显示帮助信息:独立窗口、参考某个文档、屏幕固定位置悬浮作简短提示
    • 组织帮助信息:平面结构,通过关键字访问、层次结构,查更详细信息、超文本结构
  • 3.出错信息处理
    • 以用户可用理解术语;
    • 提供清楚、易理解报错信息(出错位置、原因);
    • 从错误中恢复的建设性意见;
    • 信息用颜色等在视觉上引人注目;
    • 可能造成负面后果。
  • 4.命令交互建议保留命令交互方式
    • 控制序列:Ctrl-C(拷贝) Ctrl-H(帮助) Ctrl-P(打印)
    • 功能键:F1(帮助)
    • 键入命令
    • 命令宏机制:用户定义名字代表一个常用命令序列。

(2)设计建议

  • 1.一般交互

    • 保持人机界面菜单选择、命令输入、数据显示风格一致;
    • 提供有意义信息反馈:双向通信;
    • 破坏性动作前要确认:删除、覆盖;
    • 允许取消大多数操作;
    • 减少两次操作之间必须的记忆量;
    • 提高对话、移动和思考的效率;
    • 允许犯错误:保护不受致命错误破坏;
    • 按功能对动作分类,设计屏幕布局;
    • 提供帮助措施;
    • 用简单的动词或动词短语作为命令名。
  • 2.信息显示

    • 显示与当前工作有关信息;

    • 简单易懂方式表示数据:图形、图表;

    • 使用一致标记、标准缩写和可预知颜色;

    • 产生有意义出错信息;

  • 3.数据输入

    • 减少用户输入动作:鼠标选择、滑动标尺等;
    • 使当前不适用命令不起作用;
    • 交互灵活:保留各种输入方式;
    • 让用户控制交流;
    • 对所有输入都提供帮助;
    • 消除冗余输入:数据单位、整钱后键入.00、提供缺省值等。
-----------------------本文结束 感谢阅读-----------------------
坚持原创技术分享,您的支持将鼓励我继续创作!恰饭^.^~