zoukankan      html  css  js  c++  java
  • 197.详细设计

    第6章  详细设计

    详细设计的目标:

        得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。

    对目标系统的精确描述:

    •详细的算法

    •数据表示和数据结构

    •实施的功能和使用的数据之间的关系

           

    详细设计的任务:

    • 逻辑上正确地实现每个模块的功能。

    • 设计出的处理过程应该尽可能简明易懂。(更重要)

        面向过程的详细设计是基于结构化的程序设计技术,结构化程序设计技术是面向过程的详细设计的逻辑基础。

        结构化程序设计技术是实现上述任务的关键技术。

           

     

    6.1  结构程序设计

    •E.W.Dijkstra在60年代中期提出结构程序设计的概念

    •结构化程序设计技术:采用自顶向下逐步求精的设计方法和单入口单出口的控制结构,并且只包含顺序、选择和循环三种结构。

    •C.Bohm和G.Jacopini在数学上证明了只用“顺序”、“选择”和“循环”这三种基本的控制结构可以实现任何单入口和单出口的程序

     

    6.1 3种基本的控制结构

    • 经典的结构程序设计:只允许使用顺序、IF-THEN-ELSE型分支和DO-WHILE型循环这3种基本控制结构;

    • 扩展的结构程序设计:除了上述3种基本控制结构之外,还允许使用DO-CASE型多分支结构和DO-UNTIL型循环结构;

    • 修正的结构程序设计:除上述结构以外,还允许使用LEAVE(或BREAK)结构。

         结构程序设计是尽可能少用GO TO语句的程序设计方法。仅在检测出错误时才使用GO TO语句,而且总是使用前向GO TO语句。

     

    图6.2 其他常用的控制结构

    6.3  过程设计的工具  

    6.3.1  程序流程图

    程序流程图(程序框图):描述过程设计的方法,也是用得最混乱的一种方法。

    优点:对控制流程的描绘很直观,便于初学者掌握。

    缺点:

    (1) 不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。

    (2) 用箭头代表控制流,程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。

    (3) 不易表示数据结构。

    使用对策:只用结构程序设计允许的五种图示结构

    6.3.2  盒图(N-S图)

    一种不允许违背结构程序设计精神的图形工具。又称为N-S图。它有下述特点:

    (1) 功能域(作用域)明确,可以从盒图上一眼就看出来。

    (2) 不可能任意转移控制。

    (3) 很容易确定局部和全程数据的作用域。

    (4) 很容易表现嵌套关系,也可以表示模块的层次结构。

    看图6.4

    盒图没有箭头,因此不允许随意转移控制。

    图6.4 盒图的基本符号

    6.3.3  PAD图

    PAD是问题分析图(problem analysis diagram) 。

        它用二维树形结构的图来表示程序的控制流。

    图6.5给出PAD图的基本符号。

      

    图6.5 PAD图的基本符号

    PAD图的主要优点如下:

    (1) 使用PAD符号设计的程序必然是结构化程序。(2) PAD图所描绘的程序结构十分清晰。

    最左面的竖线是程序的主线,即第一层结构。

    随着程序层次的增加,PAD图逐渐向右延伸。

        每增加一个层次,图形向右扩展一条竖线。图中竖线的总条数就是程序的层次数。

    (3) PAD图表现的程序逻辑,易读、易懂、易记。

        程序从图中最左竖线上端的结点开始执行,自上而下,从左向右顺序执行,遍历所有结点。

    (4) 容易将PAD图转换成高级语言源程序,这种转换可用软件工具自动完成。

    (5) 即可表示程序逻辑,也可描绘数据结构。

    (6) 支持自顶向下、逐步求精方法的使用。

        开始时可以定义一个抽象的程序,随着设计的深入,使用def符号逐步增加细节,直至完成详细设计,如图6.6所示。

     

    图6.6 使用PAD图提供的定义功能来逐步求精的例子

    示例

    6.3.4  判定表

        适于表示复杂的条件组合与应做的动作之间的对应关系。

    一张判定表由以下四部分组成:

        (1)左上部列出所有条件。

        (2)左下部是所有可能的动作。

        (3)右上部是表示各种条件组合的一个矩阵。

        (4)右下部是和每种条件组合相对应的动作。

      判定表右半部的每一列实际上就是一个规则,规定了与特定的条件组合相对应的动作。

    示例:

           假设某大学要从学生中挑选男子篮球队队员,

    基本条件是:

      各门课程的平均分在70分以上,

      身高超过1.80米,

      体重超过75千克。

      需要从学生登记表中挑选出符合上述条件的男同学,并列出他们的姓名和住址,以便进一步选拔。

      用判定表表示上述条件和动作之间的关系。

     

    以行李托运费的算法为例:

    假设某航空公司规定,乘客可以免费托运重量不超过30kg的行李。

    当行李重量超过30kg时,

    对头等舱的国内乘客超重部分每公斤收费4元,

    对其他舱的国内乘客超重部分每公斤收费6元,

    对外国乘客超重部分每公斤收费比国内乘客多一倍,

    对残疾乘客超重部分每公斤收费比正常乘客少一半。

        用判定表可以清楚地表示与上述每种条件组合相对应的计算行李费的算法。见书118页表6.1 。

    6.3.5  判定树

        初次接触判定表的人理解它需要一个简短的学习过程。

        判定树是判定表的变种,也能清晰地表示复杂的条件组合与应做的动作之间的对应关系。

    判定树的优点:

       形式简单到不需任何说明,一眼就可以看出其含义,易于掌握和使用。

     

    图6.7 用判定树表示计算行李费的算法

    6.3.6  过程设计语言

    过程设计语言(PDL)也称为伪码。

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

    PDL的优点:

    • 可以作为注释直接插在源程序中间。

    • 可以使用普通的正文编辑程序或文字处理系统,方便地完成书写和编辑工作。

    • 已经有自动处理程序存在,可以自动生成程序代码。

    PDL的缺点:

    • 是不如图形工具形象直观,

    • 描述复杂的条件组合与动作间的对应关系时,不如判定表清晰简单。

    类程序设计语言(PDL)

    LOOP:Set I to (START+FINISH)/2
         If TABLE(I)=ITEM got FOUND
         If TABLE(I)<ITEM Set START to (I+1)
         If TABLE(I)>ITEM Set FINISH to (I-1)
         If(FINISH-START)>1 goto LOOP
         If TABLE(START)=ITEM got FOUND
         If TABLE(FINISH)=ITEM got FOUND
         Set FLAG to 0
        Goto DONE
    FOUND:Set FLAG to 1
    DONE:Exit

    6.4  面向数据结构的设计方法

    6.4.1  Jackson图

         数据元素彼此间的逻辑关系只有顺序、选择和重复3类,因此,逻辑数据结构也只有这3类。

    1.  顺序结构

    顺序结构的数据:由一个或多个数据元素组成,每个元素按确定次序出现一次。

    图6.8

     

    图6.8 A由B、C、D 3个元素顺序组成

    2. 选择结构

    选择结构的数据:包含两个或多个数据元素,每次使用这个数据时按一定条件从这些数据元素中选择一个。

    图6.9

     图6.9 根据条件A是B或C或D中的某一个

    3. 重复结构

    重复结构的数据:根据使用时的条件由一个数据元素出现零次或多次构成。

    图6.10

     

     

     

    图6.10 A由B出现N次(N≥0)组成

     

    6.4.2  改进的Jackson图

    上一小节介绍的Jackson图的缺点是:

    • 表示选择或重复结构时,选择条件或循环结束条件不能直接在图上表示出来;

    • 框间连线为斜线,不易在行式打印机上输出。

    改进Jackson图

    见图6.11

     

    图6.11 改进的Jackson图

        Jackson图和描绘软件结构的层次图形式类似,但是含义却很不相同:

    • 层次图中的一个方框通常代表一个模块;

    •  Jackson图的一个方框只代表几个语句。

    • 层次图表现的是调用关系,通常一个模块除了调用下级模块外,还完成其他操作;

    •Jackson图表现的是组成关系,一个方框中包括的操作仅仅由它下层框中的那些操作组成。

    6.4.3  Jackson法

    Jackson结构程序设计方法基本上由下述5个步骤组成。
    (1) 分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这些数据结构。
    (2) 找出输入数据结构和输出数据结构中有对应关系的数据单元。

    (3) 用下述3条规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图。
      ① 为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框
      ② 根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。
      ③ 根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。

    (4) 列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。
    (5) 用伪码表示程序。
    Jackson方法中使用的伪码和Jackson图是完全对应的,下面是和3种基本结构对应的伪码。

    顺序结构
    A seq
    B
    C
    D
    A end

    选择结构
    A select cond1
    B
    A or cond2
    C
    A or cond3
    D
    A end

    重复结构
    A iter until(或while) cond
    B
    A end

    下面结合一个具体例子进一步说明Jackson结构程序设计方法。
    例:一个正文文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及文件中空格字符的总个数。要求的输出数据格式是,每复制一行输入字符串之后,另起一行印出这个字符串中的空格数,最后印出文件中空格的总个数。

    输入和输出数据的结构很容易确定,用Jackson图描绘的输入输出数据结构

    导出描绘程序结构的Jackson图

    统计空格个数需要的全部操作和条件如下:
    (1)停止        (2) 打开文件
    (3) 关闭文件     (4) 印出字符串
    (5) 印出空格数目   (6) 印出空格总数
    (7) sum∶=sum+1  (8) totalsum∶=totalsum+sum
    (9) 读入字符串    (10) sum∶=0
    (11) totalsum∶=0     (12) pointer∶=1
    (13) pointer∶=pointer+1    I(1) 文件结束
    I(2) 字符串结束                  S(3) 字符是空格

    经过简单分析不难把这些操作和条件分配到程序结构图的适当位置:

    统计空格seq
    打开文件
    读入字符串totalsum∶=0
    程序体iter until文件结束
     处理字符串seq
      印字符串seq
          印出字符串
      印字符串end
      sum∶=0
      pointer∶=1
    分析字符串iter until字符串结束
     分析字符select字符是空格
       处理空格Seq
    sum∶=sum+1
    pointer∶=pointer+1
      处理空格end
    分析字符or字符不是空格
        处理非空格seq
        pointer∶=pointer+1
       处理非空格end
      分析字符end
    分析字符串end
        印空格数seq
             印出空格数目
        印空格数end
        totalsum∶=totalsum+sum
        读入字符串
      处理字符串end
    程序体end
    印总数seq
         印出空格总数
    印总数end
    关闭文件
           停止
    统计空格end

    6.5  程序复杂程度的定量度量

    •定量度量的意义:把程序的复杂程度乘以适当常数即可估算出软件中错误的数量以及软件开发需要用的工作量,定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣;程序的定量的复杂程度可以作为模块规模的精确限度。

    度量方法:

      McCabe

      Halstead

     

    6.5.1  McCabe方法

    •程序的环形复杂度:McCabe方法根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度。

    •流图:退化的程度流程图,仅仅描绘程序的控制流程,完全不表现对数据的具体操作以及分支或循环的具体条件。

    •计算环形复杂度的方法

    •环形复杂度的用途

    •圆表示结点,代表一条或者多条语句。

    程序流程图中一个顺序的处理框序列和一个菱形判定框可以映射成流图中的一个结点。

    •箭头线称为边,代表控制流。

    一条边必须终止于一个结点。

    •区域,边和结点围成的面积。

    计算区域数时应该包括图外部未被围起来的区域。

     

    图6.16 由PDL翻译成的流图

     

    图6.17 由包含复合条件的PDL映射成的流图

    2. 计算环形复杂度的方法

    3种方法:

    •V(G) = D

    D,区域数

     

    •V(G) = P + 1

    P,判定结点的数目

     

    •V(G) = E – N + 2

    E,边的条数

    N,结点数

     

    3. 环形复杂度的用途

    •预测测试难度

    •预测软件可靠性

    •V(G)高的程序难于实现,容易出错

    •模块规模参考V(G)≤10

    6.2  人机界面设计

        人机界面设计是接口设计的一个重要的组成部分。其设计质量,直接影响用户对软件产品的评价,从而影响软件产品的竞争力和寿命。

    6.2.1 人机界面设计问题

    存在的4个问题:

         系统响应时间;

         用户帮助设施;

         出错信息处理;

         命令交互。

    1. 系统响应时间

    系统响应时间:指从用户完成某个控制动作(例如,按回车键或点击鼠标),到软件给出预期的响应(输出信息或做动作)之间的这段时间。

    系统响应时间的两个重要属性:长度和易变性。

    长度:

    响应时间过长:用户就会感到紧张和沮丧。

    响应时间过短:加快用户操作节奏,易犯错误。

    易变性:指系统响应时间相对于平均响应时间的偏差。易变性低有助于用户建立起稳定的工作节奏。

    2. 用户帮助设施

        应提供联机帮助设施,这使得用户无须离开用户界面就能解决自己的问题。

    常见的帮助设施可分为:

    •集成的:设计在软件里面,它对用户工作内容是敏感的,可以缩短用户获得帮助的时间,增加界面的友好性。

    •附加的:在系统建成后再添加到软件中的,实际上是一种查询能力有限的联机用户手册。

    集成的优于附加的。

    3. 出错信息处理

    出错信息或警告信息应具有的属性:

    (1) 用用户可以理解的术语描述问题;

    (2) 提供有助于从错误中恢复的建设性意见;

    (3) 指出错误可能导致哪些负面后果(例如,破坏数据文件);

    (4) 伴随听觉或视觉给与提示。例如,在危险操作时发出警告铃声。

    (5) 不能带有指责色彩。

    4. 命令交互

    可提供二种操作方式:菜单,键盘。

    6.2.2 人机界面设计过程

    是一个迭代的过程。

          先创建设计模型,

          再用原型实现这个设计模型,

          由用户试用和评估,

          根据用户意见进行修改。

    6.2.3  人机界面设计指南

    1. 一般交互指南

    • 在执行有较大破坏性的动作之前要求用户确认。

    • 允许取消绝大多数操作。应能方便地取消已完成的操作。

    • 减少在两次操作之间必须记忆的信息量。

    • 提高对话、移动和思考的效率。应该尽量减少用户击键的次数,设计屏幕布局时应该考虑尽量减少鼠标移动的距离,尽量避免出现用户问“这是什么意思?”的情况。

    • 提供对用户工作内容敏感的帮助设施。

    2. 信息显示指南

    • 只显示与当前工作内容有关的信息。

    • 用直观的方式来表示数据。例如,用图形或图表来取代庞大的表格。

    3. 数据输入指南

    • 保持信息显示和数据输入之间的一致性

    • 使在当前动作语境中不适用的命令不起作用。这可使得用户不去做那些肯定会导致错误的动作。

    • 对所有输入动作都提供帮助。

    • 消除冗余的输入。不要求用户指定输入数据的单位;尽可能提供默认值。

  • 相关阅读:
    vscode安装插件时报错
    css-flex整理
    java学习之路--String类的基本方法
    java学习之路--面试之并发基础
    java学习之路--面试之多线程基础
    java学习之路--多线程实现的方法
    java学习之路--简单基础的面试题
    java学习之路
    jquery中remove()和empty()是区别
    创建html新元素的三种方法
  • 原文地址:https://www.cnblogs.com/ZanderZhao/p/11094741.html
Copyright © 2011-2022 走看看