第四章 笔记

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

4.1.1 结构化设计

4.1.2 结构化设计与分析关系图

4.2 软件设计的概念与原理

4.2.1 结构化设计的概念与原理——模块化

4.2.2 结构化设计的概念与原理——抽象

4.2.3 结构化设计的概念与原理——逐步求精

4.2.4 结构化设计的概念与原理——信息隐蔽

4.2.5 结构化设计的概念与原理——模块独立

 

4.3 启发规则

 

4.4 面向数据流设计方法

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

    结构化设计属于面向数据流的设计方法。

 

4.4.1 软件结构图

4.4.2 信息流类型

4.4.3 面向数据流设计过程

4.4.4 变换分析

4.4.5 事物分析

4.5 人机界面设计

4.5.1 人机界面设计问题

4.5.2 人机界面设计指南

4.6 过程设计

4.6.1 过程设计任务

4.6.2 结构化程序设计

4.6.3 结构化程序设计工具(程序流程图、N-S图、PAD图、判定表、判定数、过程设计语言)

4.6.4 程序复杂度

4.7 面向数据结构设计方法

数据结构既影响程序的结构也影响程序的处理过程,可从数据结构导出程序的处理过程,适合详细设计。

面向数据结构设计方法有两种:Jackson和Warnier方法

4.7.1 Jackson图

4.7.2 Jackson方法步骤

4.7.3 Jackson方法示例

4.1.1 结构化设计

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

概要设计:

    将软件需求转化为数据结构和软件系统结构

详细设计:

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

4.1.2 结构化设计与分析关系图

image

 

数据设计:

    数据模型及核心数据字典转变为数据结构。

体系结构设计:

    功能模型中数据流图转变成计算机模块框架。

接口设计:

    功能模型中数据流图转变成软件内部、软件协作系统间、软件与用户间通信方式。

过程设计:

    行为模型及功能模型中的“处理规格说明”转换成软件构件过程描述。

 

 

4.2.1 结构化设计的概念与原理——模块化

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

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

 

设:C(x)为复杂程度函数

      E(x)为决定解决问题x所需的工作量(时间)函数

C(P1) > C(P2)      E(P1)> E(P2)

C(P1 + P2) > C(P1) + C(P2)     E(P1 + P2) > E(P1) + E(P2)

C(P1 + P2) > C(P1) + C(P2)

E(P1 + P2) > E(P1) + E(P2)

image

4.2.2 结构化设计的概念与原理——抽象

Miller法则: Magical Number Seven,Plus or Minus Two,Some Limits on Our Capacity for Processing Information

                                                                                                          ——The Psychological Review,1956

奇妙的数字 7+2,人类信息处理能力的限度

 

抽象事物的本质特性,暂不考虑细节(人无法考虑到所有的细节,不可能刚开始就可以想到某些很难想到的奇特细节)

4.2.3 结构化设计的概念与原理——逐步求精

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

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

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

4.2.4 结构化设计的概念与原理——信息隐蔽

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

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

 

image

4.2.5 结构化设计的概念与原理——模块独立

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

两条理由:

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

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

 

耦合:

定义:

    软件结构中不同模块间互联程度度量。

    取决于模块间接口复杂程度(越复杂耦合度越高),通过接口数据(数据量越大耦合度越高)

    最求尽可能松散耦合系统。(为了追求系统模块的独立,只有模块之间的关系简单了,模块就独立了)

 

耦合示意图:

image

白色区域:四个模块

红色箭头:模块间传递的信息

 

非直接耦合:

    两个模块分别能独立地工作不需要另一模块存在

 

数据耦合:

    两模块通过参数交换数据信息(相对松散的耦合,是设计中想设计出来的耦合)

数据耦合示意图:

image

 

控制耦合:

    两模块通过参数交换控制信息(包括数字形式)(相对紧密的耦合)

控制耦合示意图:

image

 

公共环境耦合:

两个或多个模块通过一公共数据环境作用。

公共环境耦合示意图:

image

两种可能:

  1. 一模块送数据,另一模块取,等价数据耦合
  2. 两模块既往公共环境送又从里面取,介于数据耦合和控制耦合之间。

两种公共环境耦合示意图:

image

 

内容耦合(相当紧密的耦合):

  1. 一模块访问另一模块内部数据;
  2. 一模块不通过正常入口转到另一模块内部;
  3. 两模块又部分程序代码重叠(汇编程序);
  4. 一模块有多个入口。

内容耦合示意图:

image

 

耦合原则:

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

 

 

内聚:

定义:模块内各元素彼此结合紧密程度。(模块与内部元素越紧密就代表与外部越松散,就越独立)

功能内聚:(较好)

    一模块中各部分是完成某一功能必不可少组成部分。

 

顺序内聚:(较好)

    模块内处理元素同某功能密切相关,顺序执行。

 

通信内聚:(中等)

    一模块内各功能部分都是使用相同输入数据,或产生相同的输出数据。

通信内聚示意图:

image

 

过程内聚:

    模块内处理元素相关,特定次序执行。如把流程中循环部分、判定部分、计算部分分成三个模块,这三个模块都是过程内聚模块。

过程内聚示意图:

image

 

时间内聚:

    多为多功能模块,要求所有功能在同一时间内执行。如初始化模块和终止模块及紧急故障处理模块。

 

逻辑内聚:

    一模块完成功能在逻辑上属相同相似一类。

逻辑内聚示意图:

image

 

偶然内聚:

    模块内各部分间没有联系,即使有也很松散。

偶然内聚示意图:

image

 

内聚比较:

  1. 功能内聚:10分
  2. 顺序内聚:9分
  3. 通信内聚:7分
  4. 过程内聚:5分
  5. 时间内聚:3分
  6. 逻辑内聚:1分
  7. 偶然内聚:0分

 

 

4.3 启发规则

一、改进软件结构提高模块独立性

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

改善软件结构示意图:

image

 

二、模块规模应该适中

    过大分解不充分,但进一步分解不应降低模块独立性;

    过小开销大于有效操作,模块数目过多系统接口复杂;

    通常语句行数在50~100(一页纸),最多不超过500行。

三、深度、宽度、扇出和扇入应适当

    深度:软件结构控制层数,标志一个系统大小和复杂程度。

    宽度:软件结构同一层模块数最大值,越大系统越复杂。

软件结构参数示意图:

image

    扇出:

        一模块直接控制(调用)模块数,过大,模块复杂,过小(如1)不好。一般保持在3-9之间。

image

    扇入:

        有多少上级模块直接调用它,越大共享该模块上级模块越多。

image

扇出扇入不合适--改善。

image

改善高扇出软件结构示例

image

改善后的软件结构图

image

四、模块作用域应在控制域内

    作用域:受该模块内判定影响的所有模块集合。

    控制域:模块本身及所有直接或间接从属它的模块集合。

    若模块作用域不在控制域内,会增大模块间控制耦合。

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

image

改善方案一:

image

改善方案二:

image

五、降低模块接口复杂程度

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

    QUAD-ROOT(TBL,X)    QUAD-ROOT(A,B,C,ROOT1,ROOT2)

六、设计单入口、单出口模块

    避免内容耦合。

七、模块功能可预测

    输入数据相同,产生同样输出。模块功能防止过分受限。

不可预测模块:

image

过分受限模块:

image

 

 

4.4.1 软件结构图

1. 模块——在SC图中用矩形框表示,并用名字来标记它

2. 模块的调用关系和接口

image

注:数据信号用空心圆带箭头,控制信号用实心圆带箭头,模块调用关系不用带箭头的线(默认自上而下)

image

4.4.2 信息流类型

1. 变换流

    信息沿输入通路进入系统,由外部形式变换成内部形式,通过变换中心教工处理再沿输出通路换成外部形式离开软件系统。

image

2. 事务流

    信息沿输入通路到一处理,由处理根据输入信息类型再若干动作序列中选一个执行。

    处理称事务中心,完成任务:

    (1)接收输入信息(又称事物);

    (2)分析每个事物确定类型;

    (3)根据事务类型选取一活动通路

    事务流示意图:

image

4.4.3 面向数据流设计过程

image

4.4.4 变换分析

将具有变换流特点的数据流图映射成软件结构。

例:软件做在只读存储器中,使设备具有某些“智能”。假设的仪表板将完成下述功能:

  1. 通过模/数转换实现传感器和微处理机接口;
  2. 再发光二极管面板上显示数据;
  3. 指示每小时英里数(mile/h)、行驶里程和每加仑油行驶的英里数(mile/Gal)等;
  4. 指示加速或减速
  5. 超速警告:发出超速警告铃声。

1. 复查基本系统模型

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

2. 复查并精化数据流图

    正确、处理项完成相对独立功能。

数字仪表板系统数据流图

image

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

    没有明显事务中心,为变换型。

4. 找出变换中心

    确定数据流边界。

具有边界的数据流图

image

5. 完成一级分解

image

数字仪表板的第一级分解

image

6. 完成第二级分解

image

数字仪表板的第二级分解-输入结构

image

数字仪表板的第二级分解-变换结构

image

数字仪表板的第二级分解-输出结构

image

7. 对初步软件结构精化

image

 

4.4.5 事物分析

    信息流有明显事务特点(事务中心),采用事务分析方法。

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

事务分析映射方法

image

事务分析示例

image

image

 

4.5.1 人机界面设计问题

1. 系统响应时间

    从用户完成某控制动作,到软件给出预期响应。

    两个重要属性:长度和易变性。

   关于长度:

    过长用户感到不安、沮丧

    用户觉得系统立即响应时间范围0.1-1秒,超出1秒就会让用户主义到延迟

    1-10秒             鼠标显示成为沙漏

    10-18秒           由微帮助来显示处理进度

    18秒以上          显示处理窗口,或显示进度条

    过短迫使用户加快操作节奏,导致出错。

    关于易变性:

        易变性指相应时间相对平均响应时间偏低,越低越好,否则会让用户误认为系统异常。

2. 用户帮助措施

    手册和联机帮助(不离开用户界面)。

    联机帮助两类:集成帮助和附加帮助。

    集成帮助设计在软件里面,附加帮助系统建成后加到软件中,前者可用性更强。

    请求帮助:帮助菜单,特殊菜单,特殊功能键,help命令

    image

    显示帮助信息:

        独立窗口

        image

        参考某个文档

        屏幕固定位置做简短提示

        image

    组织帮助信息:

        平面结构,通过关键字访问

        层次结构,查更详细信息

        超文本结构

3. 出错信息处理

  • 以用户可理解的术语;
  • 提供清楚、易理解的报错信息(出错位置、原因);
  • 以错误中恢复的建设性意见;
  • 信息用颜色等在视觉上引人注目;
  • 可能造成的负面后果

4. 命令交互(建议保留命令交互方式)

  • 控制序列:Ctrl+C(拷贝)、Ctrl+H(帮助)、Ctrl+P(打印)
  • 功能键:F1(帮助)
  • 命令宏机制:用户定义名字代表一个常用命令序列。

4.5.2 人机界面设计指南

1. 一般交互

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

2. 信息显示

  • 显示与当前工作有关信息;
  • 简单易懂方式表示数据:图形、图表;
    image
  • 使用一直标记、标准缩写和可预知颜色;
  • 产生有意义出错信息;
    image
  • 使用模拟的方法显示信息等。
    image

3. 数据输入

  • 减少用户输入动作:鼠标选择、滑动标尺等;
    image
  • 使当前不适用命令不起作用;
    image
  • 交互灵活:保留各种输入方式;
  • 让用户控制交流;
  • 对所有输入都提供帮助;
  • 消除冗余输入:数据单位、整钱后键入.00、提供缺省值等。

4.6.1 过程设计任务

 

  • 确定模块算法
  • 确定模块使用数据结构
  • 确定模块接口(系统外部接口、用户界面、内部模块间细节、输入数据输出数据)
  • 过程设计示意图
    image

4.6.2 结构化程序设计

结构化程序设计技术是过程设计一关键技术

  • 经典定义:
    程序代码通过顺序、选择、循环三种控制结构链接,单入口单出口。
  • 扩展定义:
    可限制使用goto语句、do_until和do_case
  • 修正定义:
    leave和break,可从循环中转移出来。

4.6.3 结构化程序设计工具(程序流程图、N-S图、PAD图、判定表、判定数、过程设计语言)

一、流程图

  1. 顺序型
    几个连续的加工依次序排列
    image
  2. 选择型
    由某个判定的取值决定选择两个加工中的一个。
    image
  3. 当型循环型
    当循环控制条件成立是,重复执行特定的加工。
    image
  4. 直到型循环型
    重复执行特定的加工,知道循环条件成立时。
    image
  5. 多情况选择型
    列出多种加工情况根据控制变量的取值,选择执行其一。
    image
  6. 程序设计流程图标准化图符
    image
  7. 计算n阶乘的程序流程图
    imageimage
  8. 优点:
    对控制流程描绘直观,便于初学者掌握。
  9. 缺点:
    不是逐步求精的好工具,过早考虑流程控制,非整体结构;
    用箭头代表控制流,程序员随意转移控制;
    不易表示数据结构和调用关系。

二、N-S图

  1. 示例
    image
    image
  2. 计算n阶乘的N-S图
    image
  3. 特点:
    (1)功能域(一特定控制结构的作用域)明确;
    (2)不可能任意移动控制;
    (3)容易确定局部和全程数据的作用域;
    (4)容易表现嵌套关系,也可以表示模块的层次结构。

三、PAD图

  1. 示例
    image
  2. 计算n阶层的PAD图
    image
  3. 优点:
    (1)使用PAD图设计的程序必然是结构化程序;
    (2)PAD图描绘的程序结构十分清晰;
    (3)用PAD图表现程序逻辑,易读、易懂、易记;
    (4)容易将PAD图转换成高级语言源程序;
    (5)支持自顶向下逐步求精。
  4. 逐步求精
    image

四、判定表

能清晰表示复杂的条件组合与应做动作间的对应关系。

四部分:

    左上部列出所有条件;

    左下部所有可能的动作;

    右上部表示条件组合的一矩阵;

    右下部是和各种条件组合相对应的动作。

 

行李托运算法判定表
image

 

五、判定树

  1. 判定表的变种,表示复杂条件组合与应做动作间对应关系。
    image
  2. 优点:
    形式简单,易看出含义,易于掌握和使用。
  3. 缺点:
    简洁性不如判断表,相同数据元素重复写多遍,越接近叶端重复次数越多。

六、伪码

用正文形式表示数据和处理过程设计的工具

  1. PDL具有严格关键字外部语法,定义控制结构和数据结构;
  2. PDL表示实际操作和条件的内部语法灵活自由,适应各种工程项目需要。

4.6.4 程序复杂度

介绍使用比较广泛的McCabe方法。

  1. 根据过程设计结果画出相应流图
    流图描述程序控制流,基本图形符号如下图所示:
    image
    由流程图映射成流图
    image
    复合条件下流图映射
    image
  2. 计算流图的环形复杂度
    三种方法:
    (1)V(G) = 区域数
    (2)V(G) = E – N + 2    (E为流图中边数,N为流图中结点数)
    (3)V(G) = P + 1           (P为判定点数)
  3. 环形复杂度示例
    image

4.7.1 Jackson图

 

  • 描述数据结构:顺序、选择、重复。
    image
  • 改进:直线,选择和循环结束条件。
    image
    image

4.7.2 Jackson方法步骤

 

  1. 确定输入数据和输出数据逻辑结构,用Jackson图表示;
  2. 去定输入结构和输出结构中有对应关系(因果)的单元;
  3. 描绘数据结构的Jackson图导出描绘程序结构Jackson图;
  4. 列出所有操作和条件,分配到Jackson图中;
  5. 用伪码表示。

4.7.3 Jackson方法示例

image

image

image

image

image

image

image

image

posted @ 2020-05-11 15:11  Kmirror  阅读(1104)  评论(0)    收藏  举报