1、 软件设计阶段的目的是产生一个具有良好软件设计阶段的目的是产生一个具有良好结构的、可以初步运行的软件系统。结构的、可以初步运行的软件系统。1.软件设计过程:结构化设计软件设计过程:结构化设计 初步设计初步设计设计复审设计复审详细设计详细设计设计复审设计复审编编码码软件结构与软件结构与说明说明修改修改设计资料设计资料模块算法描述模块算法描述控制逻辑控制逻辑修改修改规格说明规格说明源代码源代码 指导原则:指导原则:层次化:合理地控制和划分软件成分的关系。层次化:合理地控制和划分软件成分的关系。模块化:充分采用信息隐蔽原则,最大限度模块化:充分采用信息隐蔽原则,最大限度地实现程序局部化和数据局部化,
2、控制复杂性。地实现程序局部化和数据局部化,控制复杂性。功能独立:尽量使每个软件成分的功能保持功能独立:尽量使每个软件成分的功能保持相对独立。相对独立。信息驱动:尽量使用分析阶段取得的成果。信息驱动:尽量使用分析阶段取得的成果。结构清晰:尽量使软件成分之间的关系简单。结构清晰:尽量使软件成分之间的关系简单。控制简单:尽量使软件成分内部的控制关系控制简单:尽量使软件成分内部的控制关系清晰,控制结构严格受限,避免混乱。清晰,控制结构严格受限,避免混乱。2.自顶向下、逐步求精的设计方法自顶向下、逐步求精的设计方法 原则原则 从软件系统的最高层开始,定义一个软件的总控从软件系统的最高层开始,定义一个软件
3、的总控程序,由它驱动第二层次的任务,再逐级向下按同程序,由它驱动第二层次的任务,再逐级向下按同样的原则依次扩展,直至最底层不可再分的任务样的原则依次扩展,直至最底层不可再分的任务(模块),编制源代码。(模块),编制源代码。基础:基于软件的控制流向或程序的控制结构。基础:基于软件的控制流向或程序的控制结构。优点:信息隐蔽。优点:信息隐蔽。各层之间存在单向的控制关系,通过传送各层之间存在单向的控制关系,通过传送必要的控制信息或数据来实现,同层之间则无控制关系;必要的控制信息或数据来实现,同层之间则无控制关系;某个数据结构某个数据结构及其操作完全位于低层,则无需在高层定义;控制关系向下传递。及其操作
4、完全位于低层,则无需在高层定义;控制关系向下传递。2.【例例】银行算法银行算法A.问题问题 假定某个银行有一笔若干个单位的资金,可供客假定某个银行有一笔若干个单位的资金,可供客户项目发展贷款,寻求一个安全的贷款策略。户项目发展贷款,寻求一个安全的贷款策略。B.规定:规定:客户预知贷款总额,且所有客户贷款总额之和将客户预知贷款总额,且所有客户贷款总额之和将超过资金总额;超过资金总额;每个客户一次请贷一个单位;每个客户一次请贷一个单位;对客户的贷款请求,可以立即付给,也可请其等对客户的贷款请求,可以立即付给,也可请其等待;待;一旦客户贷足总额,立即归还全部贷款。一旦客户贷足总额,立即归还全部贷款。
5、C.分析分析 银行存在两种可能的状态:安全、不安全。银行存在两种可能的状态:安全、不安全。安全状态:银行无论如何贷款,都有可能安全状态:银行无论如何贷款,都有可能使它当前的所有客户在有限的时间内完成项使它当前的所有客户在有限的时间内完成项目建设并归还全部贷款。目建设并归还全部贷款。不安全状态:银行将不可能实现上述目标,不安全状态:银行将不可能实现上述目标,资金无法收回。资金无法收回。例如,银行有例如,银行有10个货币单位,个货币单位,3个客户,个客户,它们的贷款总额分别为:它们的贷款总额分别为:8、3、9。状态状态1是安全的:是安全的:状态状态2是不安全的:是不安全的:银行资金银行资金:4A:
6、3(5)B:2(1)C:1(8)银行资金银行资金:1A:4(4)B:2(1)C:3(6)进一步分析:在安全状态和不安全状态之间,存在进一步分析:在安全状态和不安全状态之间,存在一个临界状态。此时,只有按照特定的贷款策一个临界状态。此时,只有按照特定的贷款策略才可以完成所有项目略才可以完成所有项目。自顶向下设计自顶向下设计 当前系统的描述:当前系统的描述:type s=record transactions:array1.n of record claim,loan:int;completed:boolean end;capital,cash:int;end;第一步:确定当前系统安全否,分两步。
7、第一步:确定当前系统安全否,分两步。function safe(current_state:s):boolean;var state:s;begin state:=current_state;试完成所有的交易;试完成所有的交易;safe:=所有的交易是否全部完成;所有的交易是否全部完成;end;安全否安全否试完成全部交易试完成全部交易是否全部完成是否全部完成第二步:针对逐个试完成交易,又分两步。此时有第二步:针对逐个试完成交易,又分两步。此时有两个程序:逐个试完成交易、所有交易是否完成。两个程序:逐个试完成交易、所有交易是否完成。逐个试完成交易逐个试完成交易 procedure complet
8、e_transactions(var state:s);var customer:int;progress:boolean;begin repeat progress:=false;for customer:=1 to n do if not pleted then if 该项交易能完成该项交易能完成 then begin 归还贷款;归还贷款;pleted:=true;progress:=true;end;until not progress;end;所有交易是否完成所有交易是否完成 function all_transactions_completed(state.s):boolean;be
9、gin if state.capital=state.cash then all_transactions_completed:=true else all_transactions_completed:=false;end;这时,系统将又向下细化一级:这时,系统将又向下细化一级:是否安全是否安全试完成全部交易试完成全部交易是否全部完成是否全部完成逐个试完成交易逐个试完成交易归还贷款归还贷款第三步:针对逐个试完成交易,又有两项任务:试第三步:针对逐个试完成交易,又有两项任务:试完成每一项交易、归还贷款。完成每一项交易、归还贷款。试完成每一项交易试完成每一项交易 function complet
10、ion_possible(claim,cash:int):boolean;begin if claimcash then completion_possible:=false else completion_possible:=true;end;归还贷款归还贷款 procedure return_loan(var loan,cash:int);begin cash:=cash+loan;end;于是,试完成所有交易的程序就完善了:于是,试完成所有交易的程序就完善了:procedure complete_transactions(var state:s);var customer:int;pro
11、gress:boolean;begin repeat progress:=false;for customer:=1 to n do if not pleted then if completion_ possible(state.transactionscustomer.claim,state.cash)then begin return_loan(state.transactionscustomer.loan,state.cash);pleted:=true;progress:=true;end;until not progress;end;这样,通过三级的求精过程,完成了全部的设计这样,
12、通过三级的求精过程,完成了全部的设计任务。整个程序结构为:任务。整个程序结构为:function safe(current_state:s):boolean;var:state:s;procedure complete_transactions(var state:s);procedure return_loan(loan,cash:int);function all_transactions_completed(state:s):boolean;function completion_possible(claim,cash:int);begin state:=current_state;co
13、mplete_transactions(state);safe:=all_transactions_completed(state);end;3 软件概念软件概念 软件结构软件结构 软件结构是指程序的系统结构。通常,它意味一软件结构是指程序的系统结构。通常,它意味一种特殊的层次控制体系,但不一定表示软件中各部种特殊的层次控制体系,但不一定表示软件中各部分处理的顺序、调用的次数或判定。仅仅体现了程分处理的顺序、调用的次数或判定。仅仅体现了程序各部分之间的控制关系。研究软件结构就是研究序各部分之间的控制关系。研究软件结构就是研究各部分划分的原则以及它们之间的联系。各部分划分的原则以及它们之间的联系
14、。软件结构的好坏对软件的质量具有极其重要的影软件结构的好坏对软件的质量具有极其重要的影响;另一方面,从不同的角度出发,同一个问题可响;另一方面,从不同的角度出发,同一个问题可以由不同的软件结构。以由不同的软件结构。要解决的问题要解决的问题 软件结构软件结构 必须着重指出,软件的层次不是固有的,在很大程度上它必须着重指出,软件的层次不是固有的,在很大程度上它是人为的。是人们为了分解大系统的复杂性而引入的。不同是人为的。是人们为了分解大系统的复杂性而引入的。不同的设计方法可以产生不同的结构,问题是何种结构使软件系的设计方法可以产生不同的结构,问题是何种结构使软件系统更加清晰、维护更加方便,这是人们
15、所关心的。统更加清晰、维护更加方便,这是人们所关心的。模块模块 模块是组成软件的最小单位。严格地定义模块是组成软件的最小单位。严格地定义是:模块是一个可以独立编址的程序单位。是:模块是一个可以独立编址的程序单位。3.结构结构 深度深度宽度宽度 软件结构的深度是指控制的层数;软件结构的深度是指控制的层数;软件结构的宽度是指同一层次的最大跨度。软件结构的宽度是指同一层次的最大跨度。模块性模块性 模块性是指软件易于开发、管理和维护的模块性是指软件易于开发、管理和维护的程度。程度。(C(P1)C(P2)(E(P1)E(P2)但是,但是,C(P1+P2)C(P1)+C(P2),因此,因此,E(P1+P2
16、)E(P1)+E(P2)但是,除了处理的复杂性以外,还存在模块之间但是,除了处理的复杂性以外,还存在模块之间接口的复杂性。开发工作量是与两者之和相关的。接口的复杂性。开发工作量是与两者之和相关的。工作量工作量模块数量模块数量接口代价接口代价模块代价模块代价总代价总代价 抽象:指开发时概括的级别,层次越高,抽象抽象:指开发时概括的级别,层次越高,抽象级别越高。级别越高。信息隐蔽:指模块内部定义的数据结构和操作信息隐蔽:指模块内部定义的数据结构和操作的外部不可见性,用以防止错误蔓延。的外部不可见性,用以防止错误蔓延。模块独立性模块独立性 模块独立性是指模块可以被独立地理解、编制、模块独立性是指模块
17、可以被独立地理解、编制、测试和修改的程度。其量度的标准是内聚和耦合。测试和修改的程度。其量度的标准是内聚和耦合。内聚:模块内部结合的紧密程度,理想的高内内聚:模块内部结合的紧密程度,理想的高内聚是一个模块恰好完成一件任务。聚是一个模块恰好完成一件任务。低低 高高共存的:模块的语句之间实际上没有联系,仅仅从存储的角共存的:模块的语句之间实际上没有联系,仅仅从存储的角度将它们放在一起;度将它们放在一起;逻辑的:将逻辑上相似的功能合并为一个模块;逻辑的:将逻辑上相似的功能合并为一个模块;时态的:将需要同时执行的程序放在一个模块内;时态的:将需要同时执行的程序放在一个模块内;以上为弱内聚的。以上为弱内
18、聚的。过程的:模块的各部分相互关联,且必须按指定的次序执行;过程的:模块的各部分相互关联,且必须按指定的次序执行;通信的:模块的各个处理部分都因用同样的数据;通信的:模块的各个处理部分都因用同样的数据;共存的共存的 逻辑的逻辑的 时态的时态的 过程的过程的 通信的通信的 顺序的顺序的 功能的功能的顺序的:模块中的各个处理部分都紧密相关于一个功能,而顺序的:模块中的各个处理部分都紧密相关于一个功能,而且其中一个部分的输出就是另一部分的输入;且其中一个部分的输出就是另一部分的输入;功能的:一个模块实现且仅实现一个功能。功能的:一个模块实现且仅实现一个功能。目标:尽可能设计高内聚的模块目标:尽可能设
19、计高内聚的模块!耦合:模块之间相互联系和依赖的程度。模块之间耦合:模块之间相互联系和依赖的程度。模块之间的耦合依赖于模块之间接口的复杂性。的耦合依赖于模块之间接口的复杂性。考察模块之间的耦合从三个角度:考察模块之间的耦合从三个角度:方式,耦合的方式;方式,耦合的方式;作用,共享信息的作用;作用,共享信息的作用;数量,模块间联系的多少数量,模块间联系的多少研究耦合的目的:防止错误蔓延。研究耦合的目的:防止错误蔓延。低低 高高数据的:模块之间通过调用进行联系,调用参数为整体变量数据的:模块之间通过调用进行联系,调用参数为整体变量的数据型参数;的数据型参数;标记的:模块之间通过调用进行联系,调用参数
20、可以是域变标记的:模块之间通过调用进行联系,调用参数可以是域变量的数据型参数;量的数据型参数;无耦合无耦合 数据的数据的 标记的标记的 控制的控制的 外部的外部的 共用的共用的 内容的内容的控制的:模块之间通过调用进行联系,调用参数可以控制下控制的:模块之间通过调用进行联系,调用参数可以控制下属模块的运行;属模块的运行;外部的:模块之间由于外部环境的约束而产生联系,例如,外部的:模块之间由于外部环境的约束而产生联系,例如,两个模块通过两个模块通过I/O联系、通过中断(如联系、通过中断(如OS)联系等;)联系等;共用的:模块之间通过共同的数据区联系;共用的:模块之间通过共同的数据区联系;内容的:
21、一个模块使用另一个模块定义的数据结构或控制信内容的:一个模块使用另一个模块定义的数据结构或控制信息。息。总之,联系方式:调用(好),直接引用数据或指令(不总之,联系方式:调用(好),直接引用数据或指令(不好),相互作用:数据交流(好),运行控制(不好)。好),相互作用:数据交流(好),运行控制(不好)。目标:尽可能设计低耦合的模块联系。目标:尽可能设计低耦合的模块联系。设计的注意要点设计的注意要点模块的大小问题:在一个编程人员可以控制的复模块的大小问题:在一个编程人员可以控制的复杂性以内;杂性以内;高内聚、耦合高内聚、耦合保持单入口、单出口,防止病态连接,推荐使用保持单入口、单出口,防止病态连
22、接,推荐使用三种结构:三种结构:争取合理的软件结构,深度过大时可以适当增加争取合理的软件结构,深度过大时可以适当增加扇出、宽度过大时可以适当减少扇出。扇出、宽度过大时可以适当减少扇出。将模块的作用范围控制在它的控制范将模块的作用范围控制在它的控制范围内。围内。ABCDEFGHIACDEFBGHI判定影响判定影响判定判定尽可能利用尽可能利用“黑箱黑箱”技术,使模块的功能可预测技术,使模块的功能可预测(具有内部(具有内部“存储器存储器”的模块功能是难预测的)。的模块功能是难预测的)。4 软件初步设计软件初步设计 软件初步设计的任务:软件初步设计的任务:得到一个良好的软件结构,又称软件的结构设得到一
23、个良好的软件结构,又称软件的结构设计。计。良好的软件结构良好的软件结构 良好的软件结构应该是模块单向依赖的,亦即良好的软件结构应该是模块单向依赖的,亦即下层模块依赖上层模块而不是反之。通常的软件结下层模块依赖上层模块而不是反之。通常的软件结构有顺序、半序和树型三种。构有顺序、半序和树型三种。顺序:顺序:偏序:偏序:树型:树型:程序结构图没有徊路!程序结构图没有徊路!2.设计方法分类:设计方法分类:面向功能的设计方法;面向功能的设计方法;面向数据流的设计方法;面向数据流的设计方法;面向数据结构的设计方法;面向数据结构的设计方法;面向数据流和面向数据结构相结合的设计方法;面向数据流和面向数据结构相
24、结合的设计方法;面向对象的设计方法;面向对象的设计方法;思想与手段思想与手段 分解与抽象,分解软件系统的复杂性。分解与抽象,分解软件系统的复杂性。面向数据流的设计方法面向数据流的设计方法 基本思想:基本思想:利用系统分析阶段得到的利用系统分析阶段得到的DFD,导出软件的系统,导出软件的系统结构。通过定义若干结构。通过定义若干“映射映射”规则,把不同的数据规则,把不同的数据流映射到软件结构。流映射到软件结构。应用范围:应用范围:原则上可以通用。特别是对软件的信息结构不十原则上可以通用。特别是对软件的信息结构不十分清晰或不易用形式化手段描述时,这种方法更有分清晰或不易用形式化手段描述时,这种方法更
25、有效。例如嵌入式软件、复杂的数值计算和分析过程、效。例如嵌入式软件、复杂的数值计算和分析过程、工业过程控制、工业过程控制、CAD、GIS应用软件等。应用软件等。(1)信息流)信息流 一般来说,信息流可以分为两个大类。一般来说,信息流可以分为两个大类。转换流:转换流:具有明显的传入、处理、传出界限的信息流。具有明显的传入、处理、传出界限的信息流。是一种基本上呈现线性形状的是一种基本上呈现线性形状的DFD。传入流传入流转换流转换流传出流传出流传入流传入流信息信息时间时间转换中心:信息和形态发生根本变化的部分转换中心:信息和形态发生根本变化的部分ABCDEFHGIJKL传入流传入流传出流传出流转换中
26、心转换中心 事务基元流:具有明显散射特性的事务基元流:具有明显散射特性的DFD。事务基元中心:对输入信息进行判断确定处理方式的部分事务基元中心:对输入信息进行判断确定处理方式的部分 ABCDHLMOEFGIJK动作路径:处理输入信息的部分动作路径:处理输入信息的部分 在大型的在大型的DFD中,这两种信息流可能同时存在。中,这两种信息流可能同时存在。(2)设计步骤)设计步骤 复审、精化复审、精化DFD,考虑正确性和合理性;,考虑正确性和合理性;确定信息流的特性,从总体上区分是转换流或事确定信息流的特性,从总体上区分是转换流或事务基元流;务基元流;确定流的边界确定流的边界 事务基元流:以事务基元中
27、心分界,分为传入、事务基事务基元流:以事务基元中心分界,分为传入、事务基元中心和动作路径;元中心和动作路径;转换流:从输入端向内推进,找出离输入端最远、但仍转换流:从输入端向内推进,找出离输入端最远、但仍构成系统的输入,与物理输入有最小的相似性(如去掉注释、构成系统的输入,与物理输入有最小的相似性(如去掉注释、间隔符,转成内部表示,经过编辑、有效性检查等)的地方,间隔符,转成内部表示,经过编辑、有效性检查等)的地方,作为传入流边界。作为传入流边界。从物理输出端开始向内推进,但仍构成系统的输出,从物理输出端开始向内推进,但仍构成系统的输出,与物理输出有最小的相似性(如未经格式编排、未作单位转与物
28、理输出有最小的相似性(如未经格式编排、未作单位转换等)的地方,作为传出流的边界。换等)的地方,作为传出流的边界。有可能传入流、传出流的边界重合,这时软件的功有可能传入流、传出流的边界重合,这时软件的功能就是分发、转换,没有实质性的处理。能就是分发、转换,没有实质性的处理。将将DFDDFD转化为软件的结构转化为软件的结构 转换流转换流软件呈现三分结构:软件呈现三分结构:总控模块总控模块传入部分传入部分转换部分转换部分传出部分传出部分传入部分:在无子流的情况,从边界由里向外推。传入部分:在无子流的情况,从边界由里向外推。ABDEC传入分控传入分控ECDBAA传出部分:在无子流的情况,由传出边界里向
29、外推。传出部分:在无子流的情况,由传出边界里向外推。IJKL传出分控传出分控JIKLK转换中心:在无子流的情况,自传入边界向传出边转换中心:在无子流的情况,自传入边界向传出边界推进。界推进。FGH转换分控转换分控FGHH 事务基元流事务基元流 软件呈现出二分结构。软件呈现出二分结构。总控模块总控模块接收部分接收部分发送部分发送部分接收部分:同转换流的传入部分类似。接收部分:同转换流的传入部分类似。AB接收分控接收分控AB发送部分:由事务基元中心向外推。发送部分:由事务基元中心向外推。CDEFGHIJKLMO发送分控发送分控LMOHIJKDFEG 继续分解,在有子流的情况,继续根据子流的类继续分
30、解,在有子流的情况,继续根据子流的类型转化。例如,上例中事务基元流的第二条路径又型转化。例如,上例中事务基元流的第二条路径又是一个转换流,假定转换转换中心是是一个转换流,假定转换转换中心是I、J,就变成:,就变成:发送分控发送分控LMO路径子控路径子控H转换微控转换微控KIJDFEG 对得到的软件结构求精。对得到的软件结构求精。原则:高内聚、低耦合;原则:高内聚、低耦合;具有相同的模块可以合并,即可以产生偏具有相同的模块可以合并,即可以产生偏序的软件结构。例如,上例的转换流中,沿着流的序的软件结构。例如,上例的转换流中,沿着流的方向出现分叉和合并,形成的软件结构中会出现一方向出现分叉和合并,形
31、成的软件结构中会出现一些相同的模块。这时就可以将它们合并;些相同的模块。这时就可以将它们合并;视情况省略分控制模块,如传入部分只有视情况省略分控制模块,如传入部分只有一个数据流进入转换中心,传入分控模块可以省略、一个数据流进入转换中心,传入分控模块可以省略、转换分控模块也可省去,传出部分也类似。转换分控模块也可省去,传出部分也类似。系统总控系统总控转换分控转换分控传入分控传入分控传出分控传出分控EDBACFGHKIJL软件结构图:软件结构图:文档整理文档整理 文档整理是软件初步设计的一个重要阶段。在得文档整理是软件初步设计的一个重要阶段。在得到软件的结构以后,必须确定模块之间的接口。要到软件的
32、结构以后,必须确定模块之间的接口。要对模块之间的调用给出明确的规定。对模块之间的调用给出明确的规定。模块处理说明:模块处理说明:模块处理说明是对系统分析阶段的加工说明加以模块处理说明是对系统分析阶段的加工说明加以细化,比较深入地描述模块在软件系统中所处的位细化,比较深入地描述模块在软件系统中所处的位置及地位。要给出它使用的外部数据(包括数据库置及地位。要给出它使用的外部数据(包括数据库中的数据、系统的全程数据结构以及上级模块的调中的数据、系统的全程数据结构以及上级模块的调用参数。还要给出它调用下级模块所使用的参数。用参数。还要给出它调用下级模块所使用的参数。5.数据设计数据设计 初步设计阶段的
33、另一个工作是进行数据设计:初步设计阶段的另一个工作是进行数据设计:数据库设计,定义数据库模式。要对系统分析阶数据库设计,定义数据库模式。要对系统分析阶段得到的段得到的E-R图进行细化,特别是为了提高效率,图进行细化,特别是为了提高效率,需要设计部分中间数据表项,例如台帐等。需要设计部分中间数据表项,例如台帐等。全程数据结构;全程数据结构;大致指出模块内部需要定义的局部数据结构;大致指出模块内部需要定义的局部数据结构;明确每个模块的明确每个模块的I/O数据及其结构。数据及其结构。模块说明的内容:模块说明的内容:模块名;模块名;模块处理的描述;模块处理的描述;模块中使用的数据:数据库表、输入、输出
34、数据、模块中使用的数据:数据库表、输入、输出数据、全程数据结构等;全程数据结构等;上级模块名;上级模块名;上级模块调用的参数及其含义和作用;上级模块调用的参数及其含义和作用;下级模块名;下级模块名;调用下级模块使用的参数及其含义和作用。调用下级模块使用的参数及其含义和作用。5 面向数据结构的设计方法面向数据结构的设计方法 数据结构与程序数据结构与程序 程序程序=数据结构数据结构+算法算法 数据结构强烈地影响软件的设计与过程设计:处数据结构强烈地影响软件的设计与过程设计:处理重复数据结构的程序往往具有循环结构;处理选理重复数据结构的程序往往具有循环结构;处理选择数据结构的程序往往具有条件判定的机
35、构;处理择数据结构的程序往往具有条件判定的机构;处理分层次数据结构的程序往往具有层次结构。分层次数据结构的程序往往具有层次结构。面向数据结构的设计方法就是把对数据结构的描面向数据结构的设计方法就是把对数据结构的描述转化为对软件结构的描述。从述转化为对软件结构的描述。从I/O数据结构出发,数据结构出发,推倒软件的结构及某些细节。推倒软件的结构及某些细节。例例 处理工资报表处理工资报表问题环境问题环境数据结构数据结构完成的任务完成的任务执行的操作执行的操作程序结构程序结构读、写读、写程程 序序 适用范围适用范围 原则上,处理定义清晰、具有层次特点的信息结原则上,处理定义清晰、具有层次特点的信息结构
36、,都可以使用面向数据结构的设计方法。如:构,都可以使用面向数据结构的设计方法。如:商业财政应用商业财政应用有明确的数据文件、输出报告有明确的数据文件、输出报告 管理信息系统管理信息系统固定的单据、报表固定的单据、报表 系统程序系统程序OS以大型表格为基本的数据结构以大型表格为基本的数据结构 DBMS处理结构定义清晰的纪录处理结构定义清晰的纪录 GIS固定的点、线、面结构固定的点、线、面结构 与面向数据流方法的不同与面向数据流方法的不同 设计出发点不同(对现实世界的观察点不同)设计出发点不同(对现实世界的观察点不同)面向数据流方法以信息在处理时刻的流向为基面向数据流方法以信息在处理时刻的流向为基
37、础,设计一个具有鲜明时序特征的软件结构,而面础,设计一个具有鲜明时序特征的软件结构,而面向数据结构的方法以信息的构成及其在处理时刻的向数据结构的方法以信息的构成及其在处理时刻的相互关系为基础,设计一个具有鲜明层次特征的软相互关系为基础,设计一个具有鲜明层次特征的软件结构及其处理细节。件结构及其处理细节。设计的最终目标不同设计的最终目标不同 前者以初步设计为目标,产生软件的模块结构,前者以初步设计为目标,产生软件的模块结构,后者以详细设计为目标,产生软件的过程描述,模后者以详细设计为目标,产生软件的过程描述,模块结构仅仅是副产品。块结构仅仅是副产品。设计步骤不同设计步骤不同 评价数据结构的特性(
38、对软件规格说明中描评价数据结构的特性(对软件规格说明中描述的信息结构进行复审)述的信息结构进行复审)将数据结构表示成初等形式(顺序、选择、将数据结构表示成初等形式(顺序、选择、循环)循环)把数据结构的初等表示映射到软件的控制层把数据结构的初等表示映射到软件的控制层次次 细化细化 开发软件的过程性描述(即完成软件的详细开发软件的过程性描述(即完成软件的详细设计)设计)Jackson方法学方法学基本思想:把一个问题分解成可以由三种结构形式基本思想:把一个问题分解成可以由三种结构形式表示的一个层次结构。表示的一个层次结构。Jackson方法以特定的数据模型为基础,但是,方法以特定的数据模型为基础,但
39、是,并不意味着必须描述数据结构的物理特性(如数据并不意味着必须描述数据结构的物理特性(如数据类型、存储长度等)。而是指观察问题的角度,是类型、存储长度等)。而是指观察问题的角度,是描述数据结构的逻辑特性,指建立面向问题的数据描述数据结构的逻辑特性,指建立面向问题的数据结构。结构。首先,建立面向问题的、由三种结构形式表示的首先,建立面向问题的、由三种结构形式表示的层次数据结构,然后映射为软件结构,同时给出层次数据结构,然后映射为软件结构,同时给出“伪码伪码”表示。表示。基本图形(树型)表示技术:基本图形(树型)表示技术:顺序:顺序:数据结构数据结构A由由B、C、D所组成,每个成分所组成,每个成分
40、仅出现一次。仅出现一次。ACBD选取:选取:数据结构数据结构A由由B或或C组成,且仅出现一次。组成,且仅出现一次。A B C选取型的推广选取型的推广ACBD重复:重复:A由多个由多个B所组成(并不给定重复次数)。所组成(并不给定重复次数)。利用这三种基本表示,可以构造任意复杂的分层利用这三种基本表示,可以构造任意复杂的分层次树型数据结构。树中的每个次树型数据结构。树中的每个“树叶树叶”都可以用一都可以用一棵子树代替。棵子树代替。AB*【例例】大学大学大学大学政政党党部部组织组织宣传宣传统战统战宣传宣传教学教学机关机关部部财务财务科研科研院院数学数学物理物理统战统战统战统战院院*【例例】列车:车
41、头、行李车、邮政车、餐车各一个,列车:车头、行李车、邮政车、餐车各一个,硬座、硬卧、软座、软卧车厢若干。硬座、硬卧、软座、软卧车厢若干。列车列车车头车头车体车体服务车厢服务车厢旅客车厢旅客车厢邮政邮政行李行李餐车餐车臥臥座座软软硬硬软软硬硬*程序结构基本图形表示法:程序结构基本图形表示法:ABCABC顺序:顺序:选取:选取:ABABCB1B2*重复:重复:回朔:回朔:quit 如果在一个需要作出选取判定的点上无法根据如果在一个需要作出选取判定的点上无法根据现有掌握的信息对判定条件进行测定,只能任择其现有掌握的信息对判定条件进行测定,只能任择其中的一个分支开始执行。在随后的执行过程中逐步中的一个
42、分支开始执行。在随后的执行过程中逐步获得足够的信息,对先前的选择进行事后评价以确获得足够的信息,对先前的选择进行事后评价以确定其是否正确。如发现当初假设的判定选择有误时,定其是否正确。如发现当初假设的判定选择有误时,要返回到原判定点并转向其它的分支,这种现象称要返回到原判定点并转向其它的分支,这种现象称为回朔。为回朔。【例例】八王后问题:如何在一个八王后问题:如何在一个88的棋盘上放置的棋盘上放置8个王后,个王后,使它们不能自相残杀。(两个王后既不能在同一行上,也不使它们不能自相残杀。(两个王后既不能在同一行上,也不能在同一列上)能在同一列上)伪码:伪码:伪码(伪码(pseudo code)是
43、一种混杂的语言,)是一种混杂的语言,它使用一种语言(通常是自然语言)的词汇它使用一种语言(通常是自然语言)的词汇和另一种语言(例如程序设计语言)的语法。和另一种语言(例如程序设计语言)的语法。前者用来描述处理的操作(因为其灵活、表前者用来描述处理的操作(因为其灵活、表达能力强),后者用来克化控制的结构(因达能力强),后者用来克化控制的结构(因为其严格、没有或较少有歧义)为其严格、没有或较少有歧义)因此,通常用伪码来描述程序的处理过程,因此,通常用伪码来描述程序的处理过程,用来书写详细设计的文档。用来书写详细设计的文档。四种程序结构的伪码表示:四种程序结构的伪码表示:顺序顺序 A seq A s
44、eq 处理处理B;处理处理B;处理处理C;处理处理C;A end;推广推广 处理处理D;处理处理E;A end;ABC 四种基本程序结构的伪码表示:四种基本程序结构的伪码表示:选取选取 A select(条件条件)A select(条件条件1)处理处理B;处理处理B;A or 推广推广 A or(条件条件2)处理处理C;处理处理C;A end;A or(条件条件3)处理处理D;A end;ABC 重复重复 A iter until (条件条件)处理处理B;A end;AB*回朔回朔 A posit(条件条件1)B seq quit A if(条件条件2)处理处理B1;quit A if(条件条
45、件3)处理处理B2;B end;A admit 处理处理C;quit A end;由此可见:条件由此可见:条件2 V 条件条件3 条件条件1ABCB1B2 Jackson方法的设计步骤:方法的设计步骤:复审,检查数据结构的合理性复审,检查数据结构的合理性 用三种基本的图形形式表示数据结构用三种基本的图形形式表示数据结构 找出输入、输出数据结构之间的对应关系(在找出输入、输出数据结构之间的对应关系(在找不到对应关系的时候,要引入中间数据结构,形找不到对应关系的时候,要引入中间数据结构,形成一串对应关系链)成一串对应关系链)根据数据结构之间的对应关系,得到程序的结根据数据结构之间的对应关系,得到程
46、序的结构构 对得到的程序结构求精(考虑回朔问题、列出对得到的程序结构求精(考虑回朔问题、列出操作和判定条件等)操作和判定条件等)伪码表示伪码表示【例例】处理卡片处理卡片 问题:一张卡片上有三个域问题:一张卡片上有三个域F1、F2、F3,若,若F1在在1,99内,则从文件中取出两个数内,则从文件中取出两个数a,b(假定(假定ab)和一个三元组()和一个三元组(x,y,z),若),若aF2b,则用(则用(F2x,F2y,F2z)作为)作为磁盘地址从磁盘上取出一个字符串磁盘地址从磁盘上取出一个字符串s,若,若F3是是s的一个子串,则打印的一个子串,则打印F3。第一步:数据结构的合理性无容置疑第一步:
47、数据结构的合理性无容置疑第二步:画出基本图形第二步:画出基本图形基本图形:基本图形:第三步:输出结构为一个字符串,基本上可第三步:输出结构为一个字符串,基本上可以忽略,输入、输出数据结构无结构冲突。以忽略,输入、输出数据结构无结构冲突。第四步:根据输入数据结构导出程序结构第四步:根据输入数据结构导出程序结构 卡片卡片F1F2F3处理卡片处理卡片此处,此处,P1:处理:处理F1,得到,得到a,b和(和(x,y,z););P2:处理:处理F2,以(,以(F2 x,F2 y,F2z)为地址得到串)为地址得到串s;P3:处理:处理F3,打印。,打印。P1P2P3第四步:求精。考虑卡片可能不符合规定的处
48、理要第四步:求精。考虑卡片可能不符合规定的处理要求,无法最终打印求,无法最终打印F3。因此:。因此:处理卡片处理卡片处理好卡片处理好卡片出错处理出错处理P1P2P3用回朔结构代替用回朔结构代替处理卡片处理卡片处理好卡片处理好卡片出错处理出错处理PPPquit第五步:伪码表示。第五步:伪码表示。处理卡片处理卡片 posit(卡片正确)(卡片正确)处理好卡片处理好卡片 seq quit 处理卡片处理卡片 if(F199)P1;quit 处理卡片处理卡片 if(F2b)P2;quit 处理卡片处理卡片 if(F3不是不是s的子串)的子串)P3;处理好卡片处理好卡片 end;处理卡片处理卡片 admi
49、t 出错处理(打印出错信息);出错处理(打印出错信息);处理卡片处理卡片 end;【例例】信用卡记帐系统信用卡记帐系统支付文件支付文件顾客文件顾客文件顾客号顾客号日期日期交易额交易额顾客号顾客号结余额结余额记账报告:记账报告:顾客号顾客号日期日期交易额交易额老结余老结余新结余新结余支付文件支付文件顾客号组顾客号组交易记录交易记录顾客号顾客号支付记录支付记录日期日期交易额交易额*基本图形表示基本图形表示支付文件:支付文件:顾客文件顾客文件顾客记录顾客记录顾客号顾客号结余额结余额顾客文件:顾客文件:*记帐报告记帐报告顾客数据顾客数据店主数据店主数据顾客号组顾客号组顾客号顾客号支付支付记录记录支付支
50、付小计小计结余结余小计小计日期日期交易额交易额老结余老结余新结余新结余销售销售总额总额总总结余结余记账报告:记账报告:*分析:系统有两个输入数据结构:支付文件、分析:系统有两个输入数据结构:支付文件、顾客文件;两个输出数据结构:记帐报告和顾客文件;两个输出数据结构:记帐报告和顾客文件。可以看出,记帐报告的内容涵盖顾客文件。可以看出,记帐报告的内容涵盖了支付文件和顾客文件的全部内容,而且,了支付文件和顾客文件的全部内容,而且,在内容的组织方式上亦基本上一致。在内容的组织方式上亦基本上一致。结论:可以以记帐报告的结构为主要参考点结论:可以以记帐报告的结构为主要参考点构造程序结构。同时,在处理的过程