1、现代软件工程,陈松乔任胜兵 编著王国军清华大学出版社,重点大学计算机专业系列教材,第4章详细设计,概要设计确定了软件系统的总体结构,详细设计又称过程设计是对概要设计结果进一步细化,给出目标系统的精确描述,以便在编码阶段直接翻译成计算机上能够运行的程序代码。例如:在概要设计中有模块要求排序,到详细设计阶段,就要给出排序的具体算法。是采用冒泡排序、插入排序、直接选择排序还是归并排序,用程序流程图或PDL语言或其他工具详细描述算法。本章主要介绍详细设计的目标、任务、图形描述工具以及一些详细设计方法。,第4章详细设计,概要设计的主要任务是回答“系统总体上应该如何做?”即将分析模型映射为具体的软件结构。
2、确定软件系统的组成成份(子系统或模块)以及各组成成份之间的相互关系。详细设计则将概要设计的结果具体化。,复习概要设计的相关内容,概要设计的任务和过程数据设计、软件结构设计、接口设计、过程设计 软件设计基本原则抽象和求精、模块化和信息隐藏、模块独立性(内聚度与耦合度) 面向数据流图的设计方法软件结构的图形表示(层次图、HIPO图、SC图)、数据流分析、事务分析,层次图,HIPO图,数据流分析,数据流分析:“输入”、“变换”、“输出”,输出,输入,4.1.1 详细设计的目标,目标:确定模块采用的算法和块内数据结构 ,具体设计目标系统,得出新系统详细设计规格说明书。详细设计规格说明书,如同为新建筑物
3、设计的施工图纸,它决定了最终程序代码的质量。,4.1.2 详细设计的任务,1.算法过程的设计 2.数据结构的设计 3.数据库物理设计 4.信息编码设计 5.测试用例的设计 6.其他设计 7.编写“详细设计说明书”,算法过程的设计 选择某种图形、表格、语言等合适的工具,表示过程处理过程的详细算法。数据结构的设计 对于处理过程中的涉及的概念性数据类型进行确切的定义 数据库物理设计 主要确定哪些依赖于具体使用的数据库系统的数据存储记录格式、存储方法和存储记录安排等。,信息编码设计 信息编码是指将某些数据项的值用某一代号来表示,以提高数据的处理效率。在进行信息编码设计时,要求编码具有以下特点。唯一性:
4、一个代码只反映一个编码对象灵活性:代码应该能适应编码对象不断发展的需要,方便修改 简洁性:代码结构应尽量简单,位数要尽量少 一致性:代码格式要统一规划 实用性:代码要尽可能反映编码对象的特点,方便使用 稳定性:代码不宜频繁变动,测试用例的设计 测试用例包括输入数据和预期结果等内容。由于进行详细设计的软件人员对处理过程的要求最清楚,因而由他们设计测试用例是最合适的。其他设计 根据软件系统的具体要求,还可以进行网络系统的设计、输入/输出格式设计、人机对话设计、系统配置设计等编写“详细设计说明书” 最后,对“详细设计说明书”进行评审。如果评审不通过,要再次进行详细设计,知道满意为止。,4.2 结构化
5、程序的详细设计技术与工具,结构化程序设计技术是一种程序设计技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构,并且只包含顺序、选择和循环三种结构。 结构化程序的详细设计目标: 是程序的控制流程线性化,即程序的动态执行顺序符合静态书写结构。 关于GOTO语句的建议: 当出现算法的自然结构被破坏的异常情况时,应保留GOTO语句。 一个好的原则是避免使用跳转表达正常的循环和条件语句。,4.2 结构化程序的详细设计技术与工具,一般详细设计的表示形式:图形、表格和语言基本要求:提供对设计的无歧义的描述,即能指明控制流程、处理功能、数据组织以及其它方面的实现细节,4.2 结构化程序的详细设计技
6、术与工具,详细设计的原则和方法: 清晰第一的设计风格 结构第一,效率第二 结构化的控制结构 所有的模块只使用单入口、单出口的3种基本控制结构 逐步细化的实现方法 把给定的模块功能转换成详细过程性描述,结构化程序的详细设计常用工具,程序流程图 盒图(N-S图) 判定表与判定树 问题分解图(PAD图) Jackson图(4.3节) Wariner图(4.4节) 伪代码和PDL语言,4.2.2 结构化程序的详细设计工具,1. 程序流程图 历史最悠久、使用最广泛的描述软件设计的方法 优点 对控制流程的描绘很直观 缺点 本质上不是逐步求精的好工具 可以随意转移控制 不易表示数据结构,1. 程序流程图,(
7、a)顺序,(b)两路选择,(c)多路选择,F,T,值1 值2 值m 值m+1,.,(d)先判条件循环,(e)后判条件循环,或,或,图 4.1 三种基本流程控制结构的流程图,1. 程序流程图,图4.3 程序流程图中常用的符号。,(a) 端接符,(b) 数据,(c) 预定义的处理,(d) 准备,(e) 文档,(f) 人工输入,(g) 人工操作,(h) 库存数据,(i) 显示,(j) 注释,(k) 联系,(l) 离页连接符,(m) 磁盘,(n) 循环上限,(o) 循环下限,(p) 处理,(q) 判断,2. 盒图,盒图又称N-S图,由Nassi和Shneiderman在1973年发表的题为“结构化程序
8、的流程图技术”的文章中提出。,盒图的优缺点,优点:强制设计人员使用结构化技术,从而保证设计的质量。可以直观看书某一特定控制结构的作用范围,便于理解设计意图、编程实现、选择测试用例等。缺点:盒图的修改比较麻烦,且结构嵌套层次较多时不太容易绘制。,例: 程序流程图、盒图,判定表与判定树,当处理中含有复杂的判断逻辑时,可以采用判定表来描述,尤其适于处理由某些条件取值的组合引发的情况。判定表一般由四部分组成:条件桩-左上部分,列出条件类型;条件条目-右上部分,列出各种条件的取值组合;动作桩-左下部分,列出所有可能的动作;动作条目-右下部分,列出各种具体的条件取值组合下采取的动作。除此之外还有表头,以便
9、其他文件引用该判定表或附件对该表的清晰描述。,例:某事业单位职工家庭用水收费(季度)处理方案如下:如果采用固定比率收费,季度用水少于60T的住户按某固定值收费,其他住户按表1中的比率计算费用。如果采用可变比率收费,每季度用水少于60T的部分用表1中的比率计算费用,其余部分按表2中的比率计算费用。表1、表2的内容对本例中的判定表(树)无直接影响。采用判定表描述,如下图,表头,动作桩,条件桩,动作 条目,条件条目,3. 判定表与判定树,判定表判定表可以把复杂的条件组合和应执行动作的对应关系描述清楚。,3. 判定表与判定树,判定表例题: 1、某校的课酬计算方案为: 基本课酬为每节课10元; 班级人数
10、超过60人,增加基本课酬的10; 班级人数超过80人,增加基本课酬的20; 如果教师为副教授,增加基本课酬的10; 教授,增加基本课酬的20; 助教,不增加课酬; 见习助教,减少基本课酬的10。用判定表,表达上述计算方案。,3. 判定表与判定树,3. 判定表与判定树,判定树判定树是判定表的图形表示形式。它的表达形式清晰,简单易懂,容易掌握和使用。,3. 判定表与判定树,4问题分析图,问题分析图(Problem Analysis Diagram)又称为PAD图,自1979年由日本日立公司提出以来,已得到一定程度的使用。问题分析图讲程序流程控制结构表示成二维树形图(树旋转90度),控制流程从上至下
11、,从左至右地执行。问题分析图强制设计人员采用结构化技术。同时,采用树形结构,既克服了程序流程图不能清晰表现程序层结构的缺点,又不同盒图将处理结束在一个盒子里而使得其不便修改,相反这种结构为软件的自动生成提供了有力的帮助。,4. 问题分析图,4. 问题分析图,例4.2 用问题分析图描述“对数组A从大到小排序”。,4.3 Jackson程序设计方法,Jackson结构程序设计方法(Jackson Structured Programming,JSP)是英国人M.A.Jackson于1975年首先提出来的一种面向数据结构的结构化程序设计方法。这一方法从目标系统的输入、输出数据结构入手,导出程序框架结
12、构,再补充其它细节,就可得到完整的程序结构图,再写出程序的过程性描述( Jackson 伪代码表示)。这一方法对输入、输出数据结构明确的中小型系统特别有效,如商业应用中的文件表格处理。,4.3 Jackson图与伪代码,Jackson图既可以表示程序结构,也可以表示数据结构,有利于结构化技术的实现。应该注意的是:Jackson图描述的是组成关系。以下表示出了Jackson图描述的三种结构。,4.3 Jackson图与伪代码,4.3 Jackson图与伪代码,4.3 Jackson图与伪代码,4.3.3 Jackson 程序设计方法的步骤,Jackson程序设计方法由下述五个步骤组成: (1)分
13、析并确定问题的输入和输出数据结构,并用Jackson图表示。 (2)找出输入和输出数据结构中有对应关系的数据单元。 (3)采用下述三条映射规则,将数据结构映射为程序结构,并用Jackson图表示。对每对有对应关系的数据单元,按其在数据结构图中的层次在程序结构图相应层次画一个处理框。对输入数据结构中剩余的数据单元,根据其所在的层次在程序结构图相应层次分别画上处理框。对输出数据结构中剩余的数据单元,根据其所在的层次在程序结构图相应层次分别画上处理框。,4.3.3 Jackson 程序设计方法的步骤,(4)列出完成程序结构图中各处理框功能的全部操作(包括“打开文件”、“关闭文件”、“变量初始化”等辅
14、助操作),以及有关条件(包括“选择”条件、“重复”条件等),并将它们分配到程序结构图的适当位置。 (5)用Jackson伪代码写出与程序结构图相对应的过程性表示。,4.3.3 Jackson 程序设计方法例题,例4.3 某装修公司的仓库存放有多种装修构件,每种构件的每次进货、出货都有相应的记录(包括构件编号、名称、数量、入/出库操作类型)存于构件记录表中。装修公司每周根据构件记录表打印一张周报表,报表的每行列出某种构件本周变化的数量,以便根据报表及时订货,有关表格如图4.11所示。,(a)构件记录表 (b)构件周报表图4.11 某装修公司有关表格 试用Jackson方法设计一个能自动生成上述周
15、报表文件的程序。,4.3.3 Jackson 程序设计方法例题,第一步:分析并确定输入输出数据结构,并用Jackson图表示。,在图中,构件记录编号相同的可能有多个,所以应在“构件记录”之上增加“构件组记录”,4.3.3 Jackson 程序设计方法例题,“表头”包括“表名行”(即“装修公司构件周报表”)和“栏名行”(即“编号”、“变化量”)。其中,I(1)表示“while构件记录表未空”;S(2)表示“是出库还是入库”;I(3)表示“while所有构件类型”。由于程序不对构件“名称”进行处理,所以输入数据结构图中“构件记录”没有“名称”这一数据单元。,4.3.3 Jackson 程序设计方法
16、例题,第二步:找出输入输出数据结构中的对应单元。,4.3.3 Jackson 程序设计方法例题,“构件周报表”是根据“构件记录表”形成的,有直接的因果关系,因此输入输出数据结构的顶层数据单元是对应的。“构件周报表”的每“行”是由每种类型的构件(编号相同)对应的构件记录汇总而成,因而不能简单地与每条“构件记录”对应。此时,应在“构件记录”之上增加“构件组记录”,以便与“构件周报表”的每“行”形成对应单元。I(1)表示“while所有构件类型”;I(2)表示“while某一构件类型(组)的所有构件”;S(3)表示“出库还是入库”,4.3.3 Jackson 程序设计方法例题,第三步:利用映射规则导
17、出程序结构。如右图所示。,4.3.3 Jackson 程序设计方法例题,第四步:列出并分配操作与条件。 (1)输入构件记录库文件名 (2)打开构件记录库文件名 (3)对构件记录库文件按编号索引 (4)创建报表文件 (5)生成表头字符串至报表文件 (6)送换行符至报表文件 (7)变化量change=0 (8)ID置为当前构件记录的编号 (9)读构件记录库文件的编号至ID (10)读构件记录库文件的数量至data (11)change=change-data (12)change=change+data (13)指向构件记录库文件的下一条记录 (14)生成编号ID字符串至报表文件 (15)生成变化
18、量change串至报表文件 (16)关闭构件记录库文件 (17)关闭报表文件 I(1):构件记录库文件未到文件尾I(2):当前构件记录的编号不等于ID S(3):当前构件记录的操作类型是出库将上述操作和条件分配到程序结构图中,如图4.14所示。,4.3.3 Jackson 程序设计方法例题,4.3.3 Jackson 程序设计方法例题,第五步:用Jackson伪代码表示程序处理过程。生成装修构件周报表 seq输入构件记录库文件名打开构件记录库文件对构件记录库文件按编号索引创建报表文件生成表头 seq生成表头字符串至报表文件end 生成表头 生成表体iter while 构件记录库文件未到文件尾
19、由构件组记录生成表行 seq 送换行符至报表文件变化量Change=0ID置为当前构件记录的编号.,应随时注意代码的良好风格!,4.4 Warnier程序设计方法,1974年,J.D.Warnier提出的软件开发方法Jackson方法类似。差别有三点:一是它们使用的图形工具不同;另一个差别是使用的伪码不同;最主要的差别是在构造程序框架时,Warnier方法仅考虑输入数据结构。和Jackson程序设计方法类似,也是由数据结构导出程序结构,但Warnier程序设计方法在逻辑上更严谨。Warnier程序设计方法分四个步骤: (1)分析输入和输出数据结构,用Warnier图表示; (2)从数据结构(主
20、要是根据输入数据结构,输出数据结 构可用来完善输入数据结构)导出程序结构,同样用Warnier图表示; (3)将程序结构改用程序流程图来表示; (4)根据程序流程图写出程序的详细过程性描述。,4.4 Warnier程序设计方法,表4.1 Warnier图的主要符号与说明,Warnier图例子:,4.4.2 Warnier程序设计步骤,Warnier程序设计的基本步骤如下: (1)分析和确定问题的输入和输出数据结构,并用Warnier图来表示; (2)从数据结构(特别是输入数据结构)导出程序的处理结构,用Warnier图表示; (3)将程序结构改用程序流程图表示; (4)根据上一步得出的程序流程
21、图,写出程序的详细过程性描述:自上而下给流程图每个处理框统一编号;列出每个处理框所需要的指令,冠以处理框的序号,并对指令分成如下几类:A、输入和输入准备指令;B、分支和分支准备指令;C、计算指令;D、子程序调用指令;E、输出和输出准备指令。将上述“分类指令表”中的指令全部按处理框序号重新排序,序号相同则基本按“输入/处理/输出”的顺序排列,从而得到了程序的详细过程性描述。,Warnier程序设计例,例4.4 某单位会计管理系统需要设计一个报表生成系统。系统的输入文件有两种记录,一种头记录,记载客户的帐号、姓名和旧余额;另一种是借贷事务记录,记载客户帐号、(借贷)事务编号、借贷金额和借贷类型代码
22、(如DB表示借,即客户取款代码;CR表示贷,即客户存款代码)。前者每一客户一个记录,后者每一客户可有零到多个记录。报表生成系统根据上述输入文件,定期产生有关客户借贷事务的报表,如图4.15所示。图中,对于报告期内没有借贷事务的客户,报表只列出客户帐号、姓名、旧余额和新余额,且新余额等于旧余额;对于报告期内有借贷事务的客户,报表将列出客户帐号、姓名、每一次借贷事务的借贷类型和借贷金额、旧余额、新余额、借款总数和贷款总数。,Warnier程序设计例,第一步:分析并确定问题的输入和输出数据结构,并用Warnier图表示,图4.16。,Warnier程序设计例,Warnier程序设计例,Warnier
23、程序设计例,第二步:从数据结构(特别是输入数据结构)导出程序处理的层次结构,仍用Warnier图表示,如图4.17所示。,Warnier程序设计例,第三步:画出和程序处理的层次结构相对应的程序流程图,如图4.18所示。与一般的程序流程图不同的是,图中在每一个判断框的上头叠加了一个矩形框,且大多用于标注某一层次的“开始”或“结束”,这样便于在第四步为它们分配有关指令。 第四步:根据程序流程图写出程序的详细过程性描述。 自上而下给流程图每个处理框统一编号,如图4.18; 列出每个处理框所需要的指令,冠以处理框的序号,并对指令分类; 将上述“分类指令表”中的指令排序,序号相同则基本按“输入/处理/输
24、出”的顺序排列,Warnier程序设计例,Warnier程序设计例,输入指令 010 读一个记录 040 读一个记录 100 读一个记录 分支指令 (转至) 010 如果文件未结束( EOF) 030 020 140 040如果读出的“客户账号”等于待处理客户账号 060 050 120 070如果“借贷类型代码”为CR 090 080 100 100如果读出的“客户账号”等于待处理客户账号 070 120如果读文件未结束(EOF),Warnier程序设计例,分支准备指令 040 “客户账号”存至待处理客户账号的存放单元 计算指令 040“旧余额”送至工作单元 060清“借款总数” 060清“
25、贷款总数” 080将“借款金额”加到“贷款总数”中 090将“贷款金额”加到“贷款总数”中 110从工作单元中减去“”借款总数 110将“贷款总数”加到工作单元,Warnier程序设计例,输出和输出准备指令 030 清打印区 040 将“旧余额”送参考单元 040 编辑“客户账号”和“姓名” 040 输出并清打印区 070编辑“事务编号” 080 编辑“借款金额” 090编辑“贷款金额” 100输出并清打印区 110 编辑“借款总数” 110编辑“贷款总数” 120根据参考单元的内容编辑“旧余额” 120输出并清打印区,Warnier程序设计例,将上述“分类指令表”中的指令排序,序号相同则基本
26、按“输入/处理/输出”的顺序排列 ,结果如下: 010 读一个记录 010如果文件未结束(EOF) 030 020 140 030 清打印区 040“客户账号”存至待处理客户账号的存放单元“旧余额”送至工作单元将“旧余额”送至参考单元编辑“客户账号”和“姓名”输出并清打印区读一个记录如果读出的“客户账号”等于待处理客户账号 060 050 120,Warnier程序设计例,060 清“借款总数”清“贷款总数” 070 编辑“事务编码”如果“借贷类型代码”为CR 090 080 将“借款金额”加到“借款总数”中编辑“借款金额” 100 090 将“贷款金额”加到“贷款总数”中编辑“贷款金额” 1
27、00 输出并清打印区读一个记录如果读出的“客户账号”等于待处理客户账号 070 110 从工作单元中减去“借款总数”将“贷款总数”加到工作单元编辑“借款总数”编辑“贷款总数” 120 根据参考单元的内容编辑“旧余额”根据工作单元的内容编辑“新余额”输出并清打印区如果文件未结束(EOF) 040 140 040,4.5 面向对象程序的详细设计,面向对象设计在详细设计阶段主要完成对象的属性和方法的设计,称之为面向对象程序的详细设计。本节只介绍面向对象程序的三种特性(封装性、继承性和多态性)以及有关的设计原则。,4.5.1 面向对象程序的特性,1.封装性在面向对象程序设计中,类的封装性是面向对象方法
28、学的中心环节,是面向对象问题求解和面向对象程序设计的基本要素。类的封装性使得数据和操作数据的算法(函数或过程)紧密得捆绑在一起,这样就可以使得操作数据的函数或过程的作用域和可视化限制在软件的局部区域内。在C+语言中,类的数据部分称为数据成员,类的算法部分称为成员函数。在C+语言中,封装性还可以通过关键字private、protected和public实现类的表示与类的实现两者之间的隔离。C+类的标准设计方法是将数据成员设计为私有的,需要向外部公开的成员函数设计成公有。,4.5.1 面向对象程序的特性,下面是日期类(CDate)的例子: /定义日期字符串类型string80 typedef ch
29、ar String8080; class CDate /定义日期类CDate /类的实现 private:int year,month,day; public:CDate(int month,int day,int year);CDate operator + (int days);void GetDateString(String80 CDate类中,数据成员year、month和day是类的实现部分之一,构造函数和重载的加法运算符等构成了类的对外接口。,4.5.1 面向对象程序的特性,2继承性在面向对象程序设计中,允许某个类继承其他类的成员函数或数据成员。被继承的累死称为基类、父类或超类,
30、继承的类称为派生类或子类。派生类继承基类的特性。,继承性实例,4.5.1 面向对象程序的特性,继承的目的:实现代码重用。 派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。 class 派生类名:继承方式 基类名 新成员声明; ; ,4.5.1 面向对象程序的特性,不同继承方式的影响主要体现在: 派生类成员对基类成员的访问权限 通过派生类对象对基类成员的访问权限 三种继承方式 公有继承 私有继承 保护继承 基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。 派生类中的成员函数可以直接访问基类中
31、的public和protected成员,但不能直接访问基类的private成员。 通过派生类的对象只能访问基类的public成员。,4.5.1 面向对象程序的特性,基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。 派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。 通过派生类的对象不能直接访问基类中的任何成员。 class Point /基类Point类的声明 public: /公有函数成员void InitP(float xx=0, float yy=0)
32、X=xx;Y=yy;void Move(float xOff, float yOff)X+=xOff;Y+=yOff;float GetX() return X;float GetY() return Y; private: /私有数据成员float X,Y; ;,4.5.1 面向对象程序的特性,class Rectangle: public Point /派生类声明 public: /新增公有函数成员void InitR(float x, float y, float w, float h)InitP(x,y);W=w;H=h;/调用基类公有成员函数float GetH() return H
33、;float GetW() return W; private: /新增私有数据成员float W,H; ;,4.5.1 面向对象程序的特性,#include #include int main() Rectangle rect;rect.InitR(2,3,20,10);/通过派生类对象访问基类公有成员rect.Move(3,2); coutrect.GetX(),rect.GetY(),rect.GetH(),rect.GetW()endl;return 0; ,4.5.1 面向对象程序的特性,4.5.1 面向对象程序的特性,多态: 不同对象收到相同的消息时,产生不同的响应。 通俗地说:
34、同一个函数名具有不同的实现(如函数重载) 同一个运算符具有不同的功能(如运算符重载) C+支持两种多态性: 编译时的多态性:静态联编重载 运行时的多态性:动态联编继承和虚函数,4.5.1 面向对象程序的特性,C+语言中运算符重载实际上是通过定义重载的运算符成员函数或友元函数来完成的。 通常把重载运算符的成员函数或友元函数,统称为运算符函数。 运算符重载成员函数定义 函数返回值类型 operator ( 形参表) 运算符重载友元函数定义 friend operator (形参表) 说明 为运算符函数运算结果的返回值类型; operator为运算符重载时必须使用的关键字,它和被重载的运算符连在一起
35、,作为运算符函数的专用函数名;,4.5.1 面向对象程序的特性,C+语言对运算符重载规定了下述一些限制:(1) 只能重载C+语言中已有运算符;(2) ,* , ,?:四个运算符不能重载;(3) 不能改变原运算符的操作数个数;(4) 不能改变原运算符原有的优先级和结合特性;(5) 不能改变原运算符对预定义类型数据的操作方式。(6) =,(), 四个运算符只能为成员函数重载,不能为友元函数重载。 (7) ,两个运算符只能为友元函数重载,不能为成员函数重载 (8)不可使用缺省参数(9) 赋值运算符重载不能继承,4.5.1 面向对象程序的特性,虚函数改变了联编方式; 将成员函数声明为虚函数相当于告诉编
36、译程序:由指针实际指向的对象类型决定调用哪个类中定义的函数 使用虚函数时的注意事项: (1)在基类(不一定是最高)中声明虚函数,用虚函数实现多态性时,派生类应从基类公有派生; (2)派生类中同型(与基类虚函数原型完全相同)的成员函数自动成为虚函数; (3)只有非静态成员函数可以声明为虚函数; (4)虚函数声明只出现在类声明中的函数原型中,而不能在成员的函数体实现的时候; (5)虚函数由成员函数调用或通过指针、引用来访问;,4.5.1 面向对象程序的特性,4.5.1 面向对象程序的特性,基类Employee class Employee protected:char Name30;char Nu
37、m5;int Work_Age;float Total_Salary;public:Employee(char* na,char* nu,int w) strcpy(Name,na); strcpy(Num,nu); Work_Age=w; /strcpy函数把na中的/字符串复制到Namevirtual void display() cout“Name ”“Num ”“WorkAge ”endl;coutNameNumWork_Ageendl; ;,4.5.1 面向对象程序的特性,派生类Managerclass Manager:virtual public Employeeprotected
38、:float Salary;public:Manager(char* na,char* nu,int w,float sa):Employee(na,nu,w) Salary=sa; void display() cout“Name ”“Num ”“WorkAge ”“Salary”endl;coutNameNumWork_AgeSalaryendl; ;,4.5.1 面向对象程序的特性,派生类Sellclass Sell:virtual pulic Employeeprotected:float Sale;public:Sell(char* na,char* nu,int w, float
39、se):Employee(na,nu,w) Sale=se; void display() cout“Name ”“Num ”“WorkAge ”“Sale”endl;coutNameNumWork_AgeSaleendl;,4.5.1 面向对象程序的特性,void main() Employee* p;p=new Manager(“Zhang“,“0001“,10,2000);p-display();p=new Sell(“Li“,“0002“,5,3000);p-display(); 运行结果: Name Num WorkAge Salary Zhang 0001 10 2000 Name
40、 Num WorkAge Sale Li 0002 5 3000,4.5.2 设计原则,1.可复用性(1)保证方法的内聚性。(2)减少方法的代码规模。(3)保持方法对外接口的一致性。(4)分离策略方法和实现方法。(5)方法应均匀覆盖数据。(6)加强封装性。(7)减少方法的耦合性。(8)利用继承机制。,4.5.2 设计原则,2.可扩展性(1)封装数据。(2)封装方法内部的数据结构。(3)避免情况分支语句。(4)区分公有方法和私有方法。 3.健壮性(1)防止输入错误。(2)把握优化代码时机。(3)选择适当的实现方法。(4)检查参数的合法性。,4.5.2 设计原则,4.协作性(1)在程序设计开始之前
41、进行周密的考虑;(2)尽量使得代码容易理解;(3)在对象模型中使用相同的名称;(4)把类打包成模块;(5)对类进行详细的文档化;(6)公开公共的设计说明书。,4.6 基于组件的程序设计方法,基于组件的程序设计方法对于保证软件开发的协调性提供了很大的帮助。本节首先介绍与基于组件的开放密切相关的三层应用体系结构的概念,然后在叙述两种对象总线技术CORBA和COM。 1.用户层用户层用于向用户显示系统中的数据并允许用户输入和编辑数据。用户层通常可以分为用户接口子层和用户服务子层。基于PC机的应用系统有两类主要的用户接口:本机用户接口和基于Web的用户接口。本机用户结课使用本机操作系统提供的服务,而基
42、于Web的用户接口基于HTML或XML,它们可以由任何平台上的Web浏览器执行。,4.6 基于组件的程序设计方法,2.业务层业务层通常可以根据具体问题划分为若干子层。业务层用于执行业务和制订数据规则。业务层为用户层提供服务。但是,业务层不与任何特定的客户捆绑在一起,而是面向所有的应用。业务规则是指一些业务算法、业务政策、法律政策等。例如,“研究生在读期间必须修满32学分才有基本资格参加论文答辩”就是一条研究生管理的规则。数据规则用来保证存储数据的合法性,有时也用来表示存储数据的完整性。业务规则通常以单独的代码模块的形式实现,而且通常存储在一个集中的地方以便所有需要使用它们的应用能够使用。这种代
43、码隔离是基于组件的软件开发的软件管理原理的具体体现。,4.6 基于组件的程序设计方法,3.数据层数据层通常可以进一步划分为数据存储服务子层和数据存储子层。业务层不应该知道它所操作的数据是如何存储或者存储在哪里的,相反,业务层依赖于数据层的数据存储服务完成实际的数据存储操作。数据存储服务通常也以单独的代码模块的形式实现,数据存储服务封装了底层的数据存储的信息 。在数据层中,数据存储子层通常就是某个或某些数据库管理系统,用来对数据库进行实质性的存储、检索、更新等操作。当然,如果系统或系统的一部分不是以数据库形式实现而是以文件或其他形式实现的,则数据存储子层可以实现对文件等进行实质性的存储、检索、更
44、新等操作。,4.6.2 CORBA对象总线技术,公共随想请求代理体系结构(Common Object Request Broker Architecture,简称CORBA)是一个拥有800多个成员公司的非营利性国际组织即对戏那个管理组织(OMG)的研究成果,这个组织包括了计算机工业界的各个主要的公司(如IBM、Microsoft、Apple、HP、SUN等),代表了整个计算机工业。CORBA的核心是对象请求代理(Object Request Broker,简称ORB)。ORB就是对象总线,它的作用就像一个中间人,使得各个对象能够相互传递请求。与ORB一同工作的各个对象既可以是客户机,也可以服
45、务器。如果对象发出请求,那么它就是客户机;如果对象接受和处理请求,则是服务器。,4.6.2 CORBA对象总线技术,OMA的四个主要的单元: (1)对象请求代理(ORB) (2)CORBA服务。 (3)CORBA公用设施。 (4)应用程序对象。,对象请求代理(ORB),公用对象服务,应用程序对象,公用设施,垂直公用设施,水平公用设施,OMG的对象管理体系结构,4.6.2 CORBA对象总线技术,1.对象请求代理(ORB)对象请求代理石管理对象之间进行通信和数据交换的中间件。,ORB,客户对象,服务器对象,请求定位 某一服务,激活服务,建立连接,通信,4.6.2 CORBA对象总线技术,2.公用
46、对象服务公用对象服务是CORBA提供的系统级服务的集合。 公用对象服务为创建对象、对象访问控制、对象跟踪和对象引用等提供了一套标准的服务。 3.公用设施CORBA公用设施是CORBA向应用程序对象提供直接应用服务的框架集合。公用设施分为两类:水平公用设施(用户界面设施、信息管理设施、系统管理设施和任务管理设施)和垂直公用设施(提供诸如金融、健康、制造、零售等“垂直市场领域的接口和标准”)。,4.6.2 CORBA对象总线技术,4.应用程序对象应用程序对象包括业务对象及其应用程序,它们是CORBA基础结构的最终使用者。业务对象分为三种:(狭义)业务对象;业务过程对象;表示对象,4.6.3 COM
47、对象总线技术,组件对象模型(Component Object Model,简称COM)是微软公司专有的对象总线技术,它是基于对象的程序设计模型。COM的目的在于使得多个软件组件能够彼此协同工作。 1. COM系统服务 2. DNA核心 3. DNA应用开发工具,4.6.4组件库技术,1.基于领域分析的软件组件选取 2.组件库的组织方式 3.组件库的检索方法 4.组件的使用,4.7 小 结,详细设计是进行逻辑系统开发的最后一个阶段,其质量的好坏将直接影响到系统的编码实现。因此,详细设计除了要保证正确性之外,要着重考虑使将来编写出的程序可读性好,易理解,易测试,易维护。程序流程图、N-S图、PAD图等都是完成详细设计的工具,结构化技术和组件技术是非常重要的设计思想,面向数据结构的程序设计方法和面向对象的程序设计方法是进行详细设计的重要方法,合理选择和正确使用有关工具、深入理解和掌握有关设计思想和方法,对搞好详细设计是非常重要的。,