410 likes | 581 Views
第 7 讲 软件设计方法. 体系结构设计. 软件体系结构是软件系统中 最本质 的东西。 良好的体系结构必须是 普适、高效和稳定的 。 [BAS98] :软件的体系结构是系统的一个或多个结构,包含 软件构件 、构件对外可见的 性质 以及它们之间的 关系 。 体系结构是 一种表示 。 体系结构设计关注构件结构、构件的性质和交互的关系。. 体系结构风格 style. 体系结构风格包含: 一组构件 (components) (如,数据库、计算模块)完成系统所需的某种功能; 一组连接子 (connectors) ,能使构件间通信协调和合作;
E N D
体系结构设计 • 软件体系结构是软件系统中最本质的东西。 • 良好的体系结构必须是普适、高效和稳定的。 • [BAS98]:软件的体系结构是系统的一个或多个结构,包含软件构件、构件对外可见的性质以及它们之间的关系。 • 体系结构是一种表示。 • 体系结构设计关注构件结构、构件的性质和交互的关系。
体系结构风格 style • 体系结构风格包含: • 一组构件(components)(如,数据库、计算模块)完成系统所需的某种功能; • 一组连接子(connectors),能使构件间通信协调和合作; • 约束(constraints),定义构件如何被集成,形成系统; • 语义模型(semantic model),使得设计者通过分析构件的已知性质而理解系统的整体性质。
客户端 客户端 客户端 共享数据 客户端 客户端 客户端 体系结构风格分类 • 数据为中心的体系结构 • 目标:实现数据的可集成性 • 共享数据可以是数据仓库或是黑板。
Application Systems Business-specific Components Middleware System Software 体系结构风格分类 • 调用-返回体系结构 • 目标:系统的可更改性和可扩展性 • 主程序-子程序体系结构 • 将一个程序分层子部分 • 每个子节点都只由父节点控制 • 如远程过程调用系统 • 面向对象或抽象数据类型系统 • 强调对数据的绑定和对数据操纵及访问方式的掌握 • 实现可更改性 • 层次式 • 可更改 • 可移植
Web sites of Interest • CMU Composable Systems Group • www.cs.cmu.edu/~Compose/ • CMU Architecture Based Languages and Environments Research Group • www.cs.cmu.edu/~able/ • The Acme ADL • www.cs.cmu.edu/~acme/ • Worldwide Institute of Software Architects • www.wwisa.org
Web Sites of Interest • The WRIGHT Language • www.cs.cmu.edu/~able/wright/ • Meta-H For Real-Time Software Analysis • www.htc.honeywell.com/projects/dssa/dssa_tools/dssa_tools_mh.html • Rapide ADL • pavg.stanford.edu/rapide/ • C2 Project at UC Irvine • www.ics.uci.edu/pub/arch/
面向数据流的设计 • 结构化开发方法(Structured Developing Method)是现有的软件开发方法中最成熟,应用最广泛的方法,主要特点是快速、自然和方便。 • 结构化开发方法由结构化分析方法(SA法)、结构化设计方法(SD法)及结构化程序设计方法(SP法)构成的。 • 结构化设计方法(SD 法 Structured Design)是结构化开发方法的核心,与SA法,SD法密切联系,主要完成软件系统的总体结构设计。 • 面向数据流的设计方法又称结构化设计。
面向数据流的设计 • 基本思想:将系统设计成由相对独立、单一功能的模块组成的结构。 • 采用方法:DFD System Hierarchy • 步骤: • 确定数据流类型; • 指明数据流的边界; • 将DFD映射为程序结构; • 根据元素的分解,定义控制的层次; • 使用设计测量和启发信息,对结构进行细化和求精; • 精化体系结构的描述。
结构图 (Structure chart) A A A A B B C D B C B b. 顺序 a. 基本形式 c. 选择 d. 重复
Incoming flow Outgoing flow External representation Information Transform flow Internal representation Time 面向数据流的设计 1、Data Flow的分类 ⑴ 变换流(Transform Flow): 事实上所有信息流都可归结为变换流
变换流 输入 变换 输出
… Transaction request … Action paths T … … … 面向数据流的设计 ⑵ 事务流(Transaction Flow) T = Call one of the several subroutines depending on the type of the incoming transaction request. 当信息流具有明显的“发射中心”时,可归结为事务流。 事务中心
变换流设计 • 变换流设计是从变换流的DFD到程序结构图的转化。 • 设计步骤: • 找出变换中心及逻辑输入/出; • 变换中心-描述了系统的主要功能、特征,其特点是:输入/出数据流较多,变换中心可以不至一个。 • 逻辑输入/出 - 是指输入/出变换中心的数据流。 • 输入流 -是将物理输入转换为逻辑输入的数据流。 • 输出流 - 是将逻辑输出转换为物理输出的数据流。 • 设计软件结构的顶层; • 为每个输入设计一个输入模块,为每个输出设计一个输出模块,同时为变换中心设计一个处理模块。 • 自顶向下,逐步细化,设计中下层模块。 • 即上层各个模块的从属模块,顺序一般是从设计输入模块的下层开始。
3 2 1 4 5 6 变换流设计 D C F B E G A H 输入 变换中心 输出 System 3 D C C D E E Get C 须检查; 每个传递的数据是否必须? 完成模块功能所必须的数据是否都传递了? 传输的数据是否只与单一的功能有关?是否目的明确? Make C into D and E Put E Put D E D F G C B B F G Make D into F Make E into G Make B into C Put G Put F Get B G H B H A A Make G into H Put H Make A into B Get A
2.1 X 2.2 Z 2.3 Y 1 3 变换流设计 M B C N P D A System 2 C B B C Make B into C Get B Put C B C N P M M N P X Y Z
面向数据流的设计 例:汽车数字仪表板的设计 变换流分析 功能:① 通过模 - 数转换实现传感器和微处理机接口; ② 在发光二极管面板上显示数据; ③ 指示每小时英里数(mph),行驶的里程,每加仑油行驶的英里数(mpg)等等; ④ 指示加速或减速; ⑤ 如果车速超过55mph ,则发出警告铃声。
旋转信号 箭头指示 SPS 读 旋转信号 收集和求平均 确定加/减速 转换成 转/分 计算里程 产生里程显示 计算燃料消耗 计算gph 读和校核 产生mpg显示 产生mph显示 发出铃声 SPS 燃料流 传感器信号 上箭头 水平线 下箭头 SPS rpm 燃烧流 rpm 英里 显示 超速值 计算mph,超速值 产生 加/减速显示 gph mph mph 铃声 mpg mph显示 mpg显示 面向数据流的设计 第一步:DFD的分界,先分出I、P、O三块
数字仪表板 控制 接收传感器 信号 数据转换 控制 驱动仪表板 M I P O 面向数据流的设计 一般问题的一级分解方法:
:由边界向回溯,将每个遇到的处理器映成相应的层模块。:由边界向回溯,将每个遇到的处理器映成相应的层模块。 :每个处理直接对应一个下层模块。 :由边界向外推,方法与 类似 O I P M I C B D A I D A C B 面向数据流的设计 第二步:映射
数字仪表板 控制 接收传感器 信号 数据转换 控制 驱动仪表板 转换成rpm 计算gph 确定加/减速 计算mph 计算mpg 计算里程 加/减速 显示 显示mpg 显示mph 显示里程 发出铃声 收集sps 读燃料流 发光二极管显示 读旋转信号 面向数据流的设计 例:
面向数据流的设计 第三步:修改 —— 本着高内聚、低耦合的原则。 例:精化后的数字仪表板系统的软件结构。 注:每个模块应附一简要说明描述 ① 进出该模块的信息(接口描述); ② 模块内部的信息; ③ 过程陈述,包括主要判定点及任务等; ④ 对约束和特殊特点的简短讨论。
事务流设计 • 事务流设计是从事务流的DFD到程序结构的转换。 • 设计步骤: • 确定流界: • 先从DFD中找出事务流、事务处理中心和事务路径。事务中心前是接收事务、事务中心后是事务路径。进行一级分析,设计顶层模块。 • 进行一级分析,设计上层模块: • 从DFD中导出具有接收和发送分支的软件结构。对事务中心设计为“事务控制”、对事务流为“接收事务”、对事务路径为“发送事务”。 • 细化该事务结构和每条动作路径的结构。 • 对于接收分支,采用变换流设计方法设计中下层;对于发送分支,在发送模块下设计每条事务路径的结构。
M S I II II S I A B C … … … C B A … … … 事务流设计 事务流 事务中心 事务处理
混合流设计 • 一般采用以变换流为主,事务流为辅的方法。 • 基本步骤: • 利用变换设计,将DFD划分为输入、变换和输出三大部分; • 设计软件结构的上层模块,即主模块,及其下层输入模块、变换模块和输出模块; • 根据输入、变换和输出DFD的不同特征设计它们的下层模块。
LL T2 T1 T3 JJ GG KK EE DD BB AA FF System K D D K Make D into K Get D Put K 混合流设计 H E D C1 G K C2 F J C3 B1 B2 B3 L B A M
System K D D K Make D into K Get D Put K Get C DD EE FF GG JJ KK Put L Get B Edit BB LL Put M Get A AA T1 T2 T3 Operate 1 Operate n … Detail 1 … Detail m
精化数据流图 “变换” “事物” 区分事务中心和数据接收通路 区分输入和 输出分支 映射成事务结构 映射成变换结构 用启发式设计规则精化软件结构 导出接口描述和 全程数据结构 详细设计 流类型 复 查 变换分析 事务分析 面向数据流的设计过程 优化的前题是:“Get it to work, then make it fast.”
精化体系结构设计 • 为每个模块开发处理说明; • 为每个模块提供接口描述; • 定义局部和全局数据结构; • 给出所有的设计限制或约束; • 进行设计评审; • 如需要,进行结构设计优化。
SD方法的优点 • SD方法是从以下5个方面来获得质量较好的软件结构: • 根据描述用户需求的数据流图导出了实现用户需求的结构图。 • 为了控制大型软件系统复杂性,运用了下面两个手段: • 将系统分解成许多个黑盒。 • 将黑盒组织成适合于用计算机实现的一个层次结构。 • 用内聚和耦合作为评价软件结构质量的标准。 • 给出一组设计技巧,如扇入和扇出、模块大小的掌握,作用范围和控制范围等。 • 用结构图直观地描述软件结构,因此易于理解,并直接可以用于评价、分析和复查等。
SD方法的缺点 • SD方法的不足: • 软件系统的概要设计应该包括两个方面:数据结构的设计和程序结构的设计,两者是密切相关的,但遗憾的是SD方法只考虑后者而不考虑前者,因此在使用 SD方法时,一般还需参考一些有关数据库、文件结构的设计方法。 • “高内聚、低耦合”的原则虽已被广为接受,但这两个概念尚无严格的定义,更无健全的理论基础,只能用些例子来解释其含义,因而对实际系统的软件结构还难以作客观的质量评价,这是SD方法的一个缺陷。
面向数据结构的设计 • 结构化开发方法是一种面向数据流、数据封闭性的开发方法,来源于程序的模块化和功能分解。面向数据结构的设计是将问题的数据结构转换为程序结构,着重于问题的数据结构,不强调模块定义。 • Jackson系统开发方法是JSP的扩展,是一种面向数据结构的设计方法,其基本思想是先建立输入输出的数据结构,再将其转换为软件结构。这种方法适用于数据处理类问题,特别是企业管理类的软件系统。
面向数据结构的设计 • 程序逻辑构造(logical construction of programs, LCP)由Warnier开发,是建立在数据结构和过程结构之间关系上的方法,将I/O数据结构映射为软件详细过程表达。 • Wariner-Orr方法是LCP的扩展,除了设计能力之外,还增加了分析能力。
Jackson System Development (JSD) • 与SD的由DFD导出结构设计不同,JSD是以数据结构(data structure)为基础设计每个模块的处理过程。 • 分析的重点是构造于系统相关的现实世界,并建立现实世界的信息域模型,目标是生成软件的过程性描述。 • JSD的特点:获得简单清晰的设计方案,因为这样的方案易于理解、易于修改。 • JSD的设计原则:使程序结构同数据结构相对应。
A A A S I Bo Co B* B C A = A = B A = S B B C C Jackson System Development(JSD) 1、Jackson Diagram: 注意: 层次方框图H中的方框表示模块,而JD中的方框代表几个语句构成的简单操作; H表现调用关系,而JD表现组成关系。
Jackson System Development(JSD) 2、Jackson方法: 例:一个正文文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及文件中空格字符的总个数。要求的输出数据格式是:每扫描一行输入字符串之后,换行打印出这个字符串中的空格数,最后打印出文件中空格的总个数。
输出 输入 输出表格 正文文件 I 字符串* 表格体 空格总数 I I 字符* 串信息* S 空格O 非空格O 字符串 空格数 Jackson System Development(JSD) 第1步:用Jackson图描述 I\O 的数据结构,包括顺序、选择和重复 第2步:在两个图中指出有直接因果关系(causality)、可以同时处理的单元(重复的次序,次数均相同)
输出 输入 输出表格 正文文件 I 字符串* 表格体 空格总数 I I 字符* 串信息* ? S 空格O 非空格O 字符串 空格数 ? JSD 经过程序处理由正文文件得到输出表格。 每处理输入中一个字符串后就得到输出中一个串信息,二者重复次序和次数均相同。 字符不与多字符组成的字符串对应。 单个空格不能决定空格数。
第3步:Data structure Program structure • 用下述三条规则从描述数据结构的Jackson图导出描述程序结构的Jackson图: • 第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(注意,若这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则和它们对应的处理框在程序结构图中所处的层次与它们之中在数据结构图中层次低的那个对应); • 第二,根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图中的相应层次分别为它们画上对应的处理框; • 第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图中的相应层次分别为它们画上对应的处理框。
输出 输入 输出表格 正文文件 程序体 印总数 I I 字符串* 表格体 空格总数 处理字符串* I I 字符* 串信息* 分析字符串 印字符串 印空格数 S I 空格O 非空格O 字符串 空格数 分析字符* S 处理空格o 处理非空格o 第3步:Data structureProgram structure 把有对应关系的单元合为一个处理框,画在相应的层次中(不同层以低层为准) 统计空格 分析字符* 注:顺序执行的处理中不允许混有重复执行或选择执行的处理。
第4步:列出所有操作条件,并分配到上幅程序结构图中第4步:列出所有操作条件,并分配到上幅程序结构图中