软件制造工程第三章.ppt

上传人:牧羊曲112 文档编号:6206782 上传时间:2023-10-05 格式:PPT 页数:87 大小:229KB
返回 下载 相关 举报
软件制造工程第三章.ppt_第1页
第1页 / 共87页
软件制造工程第三章.ppt_第2页
第2页 / 共87页
软件制造工程第三章.ppt_第3页
第3页 / 共87页
软件制造工程第三章.ppt_第4页
第4页 / 共87页
软件制造工程第三章.ppt_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《软件制造工程第三章.ppt》由会员分享,可在线阅读,更多相关《软件制造工程第三章.ppt(87页珍藏版)》请在三一办公上搜索。

1、软件制造工程,第三章 编程工程,第三章 编程工程,编程工程的定义和内容结构化编程编码规范编程前的准备编程实施,3.1.1 编程工程的定义和内容,编程工程就是用程序设计语言把程序设计的结果和过程翻译为在计算机相应环境下可运行的软件产品,把系统工程师按照用户需求设计出来的系统构架变为真正可运行的软件系统的工程。,3.1.1 编程工程的定义,编程工程的作业内容详细地划分为制定工作标准,制定编码基准,理解设计书,程序编码,自查,送上级系统工程师审查,修改以及进行单元测试等若干步骤.,3.2 结构化编程,结构化开发-结构化分析、结构化设计和结构化编程三个阶段,3.2.1 结构化开发过程,3.2.1 结构

2、化开发过程,1、结构化分析结构化分析方法的核心是沿数据流程图自顶向下、逐步求精,是最经典的面向数据流的需求分析方法。结构化分析方法使用系统流程图、数据流程图、数据字典、ER图、处理说明等工具来描述系统的功能需求、数据需求、运行需求和系统扩充需求。该方法广泛应用于银行,证券,商务处理,生产管理等大中型信息管理系统的需求分析过程。,3.2.1 结构化开发过程,在软件系统开发的初期阶段,首先要对用户的现行业务运行系统进行调查和现状分析,把握用户对新的开发系统的要求和希望,从用户提供的基本信息中,整理出开发系统目的和可能实现的功能范围,设计出新系统的数据流程图(DFD:Data Flow Diagra

3、m),显示屏幕关连图和功能概要说明书。,3.2.1 结构化开发过程,2、结构化设计结构化设计方法通常也叫做面向数据流的设计、面向行为的设计。结构化设计方法是以需求分析阶段获得的新系统的数据流程图(DFD)和显示屏幕关连图为基础,通过一系列映射,自顶向下,逐步细化,把它们变换为具体的程序概要结构图和屏幕设计式样,把一个个复杂的问题分解细化为由多个功能模块组成的具有层次结构的软件系统。,3.2.1 结构化开发过程,3、结构化程序制造结构化程序制造由结构化程序设计和结构化程序编码组成,它以外部设计和内部设计过程中获得的软件结构图及其相关设计资料为基础,采用自顶向下,逐步细化的方法,把一个个模块的功能

4、逐步分解,细化为一系列具体的步骤,作出结构化程序设计说明书,程序员再按照程序设计说明书和系统设计的相关资料,把一步步的处理说明翻译成一系列用某种程序设计语言编写的程序代码。,3.2.2 结构化编码,程序代码的质量与软件系统外部设计和内部设计的质量直接相关,同时,程序设计语言的特性和程序员的编码水平,程序代码的可读性,可维护性,可靠性,可测试性都是直接影响程序质量的因素。,3.2.2 结构化编码,结构化编码采用自顶向下,逐步细化的方法,先全局,后局部,先整体,后细节,先抽象,后具体,逐步求精,编制出来的程序具有清晰的逻辑层次结构,容易阅读、理解、修改和维护,可以提高软件质量,提高软件开发的成功率

5、和生产性。,结构化编码过程中,要遵循以下几个主要的原则:,尽可能使用语言提供的基本控制结构,顺序结构、选择结构和重复结构。选用的控制结构只准许有一个入口和一个出口。利用程序内部函数,把程序组织成容易识别的内部函数模块,每个模块只有一个入口和一个出口,一般不超过100行。复杂结构应该用基本控制结构组合或嵌套来实现。尽可能减少GOTO语句的使用,一般限制用到以下三种情况:把控制转移到出错处理。把控制转移到函数模块结束 从深层嵌套的循环退出,3.2.2 结构化编码,大量采用GOTO语句实现控制路径,会使程序路径变得复杂而且混乱,但有时完全不用GOTO语句,可能会增加程序实现的复杂度。例如,在查找结束

6、时、文件访问结束时或出现错误情况要从循环中转出时,使用GOTO语句会使程序更加清晰易懂。所以,应该加以限制地使用GOTO语句。,程序1 if(A B)goto 120;if(B C)goto 110;100 write(C);goto 140;110 write(B);goto 140;120 if(A C)goto 130;goto 100;130 write(A);140 end,例1 打印A,B,C三数中最小者程序,程序2 if(A B)and(A C)then write(A)else if(A B)and(B C)then write(B)else write(C)endif end

7、if,3.2.3 结构化编码,在结构化程序的实现方法中,有两种常用的基本方法,第一是分类(BREAK)处理方法,第二是匹配(MATCHING)处理方法。,BREAK方法的引入:问题:根据学生成绩文件,统计各班的平均分,并输出到班级平均成绩文件中?,程序处理过程(PDL代码):读入学生成绩文件的第一个记录;beforeKey=这个纪录的班级编号;sum=这个纪录的成绩;n=1;While(学生成绩文件没有结束)读入下一个学生成绩记录;afterKey=这个纪录的班级编号;if(afterKey=beforeKey)sum+=这个纪录的成绩;n+;else 输出sum/n到班级平均成绩文件;bef

8、oreKey=afterkey;sum=这个纪录的成绩;n=1;输出sum/n到班级平均文件;,Break方法处理概要,BREAK方法的前提条件:在进行BREAK处理之前,输入文件必须是已经按照关键字项目值进行排序(升序或者降序)处理好的。,3.2.2 结构化编码,BREAK方法的处理流程说明:按关键字项目值的升序读入输入文件的记录,把关键字项目的值存入工作变量中。关键字项目的值相同时,进行统计处理(或者其他处理)。关键字项目的值发生了变化(BREAK)的时候,把变化前(BREAK BEFOR)的关键字项目值和统计结果输出到文件中(或者其他处理),用变化后(BREAK AFTER)的关键字项目

9、值替换变化前的关键字项目值。,3.2.2 结构化编码,读入输入文件的下一条记录,把关键字项目的值存入变化后的工作变量中。继续进行上述至的处理,直至文件读入结束。,BREAK处理流程,汇总处理,学生名称文件,学生成绩文件,学生成绩汇总文件,MACHING方法的引入:问题:读入学生名称文件和学生成绩文件,把相同编号的数据记录结合起来,输出到学生成绩汇总文件中?,程序处理过程(PDL代码):读入学生名称文件的第一个记录;bKey=这个纪录的学号;读入学生成绩文件的第一个记录;tKey=这个纪录的学号;While(学生成绩文件没有结束)if(bKey=tKey)输出bKey记录的学号、姓名和tKey记

10、录的单科成绩和总成绩 到学生成绩汇总文件中;读入下一个学生成绩记录;tKey=这个纪录的学号;else if(bKey tKey)读入下一个学生名称记录;bKey=这个纪录的学号;else 输出错误信息(学号为tKey的学生记录在学生名称文件中没有);读入下一个学生成绩记录;tKey=这个纪录的学号;,MACHING方法处理概要,3.2.2 结构化编码,MATCHING方法的前提条件:在进行MATCHING处理之前,输入文件必须是已经按照关键字项目的值进行排序(升序或者降序)处理好的。,3.2.2 结构化编码,MATCHING方法处理流程说明:按关键字项目值的升序读入基础文件的记录,把关键字项

11、目的值存入基础KEY工作变量中。按关键字项目值的升序读入事务文件的记录,把关键字项目的值存入事务KEY工作变量中。基础KEY的值与事务KEY值相等时,把事务文件的数据编辑输出到文件中。读入事务文件的下一条记录,把关键字值存入事务KEY。,3.2.2 结构化编码,基础KEY的值大于事务KEY值的时候,把事务KEY的值写到错误信息文件中。读入事务文件的下一条记录,把关键字值存入事务KEY。基础KEY的值小于事务KEY值的时候,读入基础文件的下一条记录,把关键字值存入基础KEY。继续进行上述至的处理,直至文件读入结束。,MACHING处理流程,3.3 编码规范,代码组织与风格注释命名 声明语句结构,

12、3.3.1 代码组织与风格,1 基本原则 代码的组织和风格的基本原则是:便于自己的开发,易于与他人的交流。因个人习惯和编辑器等可以设置和形成自己的风格,但必须前后一致,并符合本规范的基本要求和原则。,3.3.1 代码组织与风格,2 缩进 子功能块当在其父功能块后缩进。当功能块过多而导致缩进过深时将子功能块提取出来做为子函数。代码中以TAB(4个字符)缩进,在编辑器中请将TAB设置为以空格替代,否则在不同编辑器或设置下会导致TAB长度不等而影响整个程序代码的格式。例如:缩进示例:public void methodName()if(some condition)for()/some senten

13、ces/end for/end if,3.3.1 代码组织与风格,3长度 为便于阅读和理解,单个函数的有效代码长度当尽量控制在100行以内(不包括注释行),当一个功能模块过大时往往造成阅读困难,因此当使用子函数等将相应功能抽取出来,这也有利于提高代码的重用度。单个类也不宜过大,当出现此类情况时当将相应功能的代码重构到其他类中,通过组合等方式来调用,建议单个类的长度包括注释行不超过1500行。尽量避免使用大类和长方法。,3.3.1 代码组织与风格,4行宽 页宽应该设置为80字符。一般不要超过这个宽度,这会导致在某些机器中无法以一屏来完整显示,但这一设置也可以灵活调整。在任何情况下,超长的语句应该

14、在一个逗号后或一个操作符前折行。一条语句折行后,应该比原来的语句再缩进一个TAB或4个空格,以便于阅读。,3.3.1 代码组织与风格,5间隔 类、方法及功能块间等应以空行相隔,以增加可读性,但不得有无规则的大片空行。操作符两端应当各空一个字符以增加可读性。相应独立的功能模块之间可使用注释行间隔,并标明相应内容,3.3.1 代码组织与风格,6 对齐 关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。连续赋值时当对齐操作符。当方法参数过多时当在每个参数后(逗号后)换行并对齐。当控制或循环中的条件比较长时当换行(操作符前)、对齐并注释各条件。变量定义最好通过添加空格形成对齐,同一类型的

15、变量应放在一起 例,/*变量对齐-*/代码对齐和间隔示例 int count=100;int length=0;String strUserName=null;Integer porductCode=new Integer(2);/产品编码数组/*参数对齐-*/public Connection getConnection(String url,String userName,String password)throws SQLException,IOException/*换行对齐-*/public final static String SQL_SELECT_PRODUCT=“SELECT*

16、“+“FROM TProduct WHERE Prod_ID=”+prodID;/*条件对齐-*/if(Condition1/当条件一/循环终止条件 i+),3.3.1 代码组织与风格,7 括号 中的语句应该单独作为一行,左括号当紧跟其语句后,右括号永远单独作为一行且与其匹配行对齐,并尽量在其后说明其匹配的功能模块。较长的方法以及类、接口等的右括号后应使用/end.等标识其结束。如:类的结束符:/EOC ClassName,方法结束符:/end methodName(),功能块结束:/end if.userName is null?循环快结束:/end for.every user in us

17、erList 左括号是否换行等随个人习惯而定,若换行则当与其前导语句首字符对齐。,注释分为序言性注释和功能性注释功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,或是执行了下面的语句会怎么样。而不要解释下面怎么做。例如,/*ADD AMOUNT TO TOTAL*/TOTAL=AMOUNTTOTAL不好。,注释,如果注明把月销售额计入年度总额,便使读者理解了下面语句的意图:/*ADD MONTHLY-SALES TO ANNUAL-TOTAL*/TOTAL=AMOUNTTOTAL,注释,1基本原则(1)注释应该增加代码的清晰度。代码注释的目的是要使代码更易于被其他开发人员等理

18、解。(2)如果你的程序不值得注释,那么它很可能也不值得运行。(3)避免使用装饰性内容。(4)保持注释的简洁。(5)注释信息不仅要包括代码的功能,还应给出原因。(6)不要为注释而注释。(7)除变量定义等较短语句的注释可用行尾注释外,其他注释当避免使用行尾注释。,注释,2文件注释 在每个文件的头部都应该包含该文件的功能、作用、作者、版权以及创建、修改记录等。,*/,注释,3类、接口注释 在类、接口定义之前当对其进行注释,包括类、接口的目的、作用、功能、继承于何种父类,实现的接口、实现的算法、使用方法、示例程序等。,/*类名:StringUtil 功能:定义字符串操作时所需要用到的方法,如 转换中文

19、、HTML标记处理等。作者:彭辉版本:1.0版备注:*/public class StringUtil,注释,4 方法注释 明确该方法功能、作用、各参数含义以及返回值等。复杂的算法用/*/在方法内注解出。参数注释时当注明其取值范围等。返回值当注释出失败、错误、异常时的返回情况。异常当注释出什么情况、什么时候、什么条件下会引发什么样的异常,/*函数名:executeQuery功能:该方法根据SQL语句,查询数据库,返回它的结果集 参数:1、sqlin:标准的SQL语句,不可以为空串返回值:ResultSet结果集,若查询失败则返回null 异常:SQLException,当查询数据库时可能引发此

20、异常备注:*/public ResultSet executeQuery(String sql)throws SQLException/Statement和SQL语句都不能为空 if(null!=stmt/end executeQuery(),注释,5 其他注释 应对重要的变量加以注释,以说明其含义等。应对不易理解的分支条件表达式加注释。不易理解的循环,应说明出口条件。过长的方法实现,应将其语句按实现的功能分段加以概括性说明。对于异常处理,当注明正常情况及异常情况的条件,并说明当异常发生时程序当如何处理。注释在源代码中的比例一般为20%左右,命名,1基本原则 规范的命名能使程序更易阅读,从而更

21、易于理解。它们也可以提供一些标识功能方面的信息,有助于更好的理解代码和应用。名字应能反映它所代表的实际东西,应有一定实际意义。例如,表示次数的量用Times,表示总量的用Total,表示平均值的用Average,表示和的量用Sum等使用可以准确说明变量/字段/类/接口/包等的完整的英文描述符。例如,采用类似 firstName,listAllUsers 或 CorporateCustomer 这样的名字,严禁使用汉语拼音及不相关单词命名。采用该领域的术语。如果用户称他们的“客户”(clients)为“顾客”(customers),那么就采用术语 Customer 来命名这个类,而不用 Clie

22、nt。,采用大小写混合,提高名字的可读性。一般应该采用小写字母,但是类和接口的名字的首字母,以及任何中间单词的首字母应该大写。尽量少用缩写,但如果一定要使用,当使用公共缩写和习惯缩写等,如实现(implement)可缩写成impl,经理(manager)可缩写成mgr等,严禁滥用缩写。避免使用长名字(最好不超过 25 个字母)。避免使用相似或者仅在大小写上有区别的名字。,命名,2类、接口 所有单词首字母大写。使用能确切反应该类、接口含义、功能等的词。一般采用名词。例:class StringList 3 常量 采用完整的英文大写单词,在词与词之间用下划线连接,如:Static final in

23、t DEFAULT_VALUE=10;,命名,4 变量和参数 变量命名由(前缀+修饰语)构成。现在比较流行的是一套由微软的一个匈牙利软件工程师首先使用,并且在微软推广开来,现在被称之为匈牙利命名法的命名规则。匈牙利命名法规定,使用表示标识符所对应的变量类型的英文小写缩写作为标识符的前缀,后面在使用表示变量意义的英文单词或缩写进行命名。下面是匈牙利命名法中的一些命名前缀:(1)类型前缀:用s(String)表示字符串,c(char)表示字符,n(number)数值,i(intger)表示整数,d(double)表示双精度,f(float)浮点型,b(bool)布尔型,dt(date)表示日期型.

24、例如:iLength表示整型的局域变量,是用来标识长度的.sCode表示字符串型的局域变量,用来标识代码。bFlag,nCount;,命名,5 组件/部件 应采用完整的英文描述符命名组件(接口部件),遵循匈牙利命名法则 如:btnOK,lblName。控件命名由(前缀+修饰语)构成。前缀即为控件的名称或缩写。控件种类前缀例命令按钮btnbtnSave组合框cmb cmbCondition文本框txttxtUserName标签lbllblOpenDate列表框 lst lstSelectedItem检查框chkchkKey,命名,6 方法 方法的命名应采用完整的英文描述符,大小写混合使用:所有中

25、间单词的第一个字母大写。方法名称的第一个单词常常采用一个有强烈动作色彩的动词。取值类使用get前缀,设值类使用set前缀,判断类使用is(has)前缀。例:getName()setSarry()isLogin()checkUser(),3.3.4 声明,1 方法 良好的程序设计应该尽可能减小类与类之间耦合,所遵循的经验法则是:尽量限制成员函数的可见性。如果成员函数没必要公有(public),就定义为保护(protected);没必要保护(protected),就定义为私有(private)。声明顺序:构造方法 静态公共方法 静态私有方法 公共方法受保护方法 私有方法 继承自Object的方法,

26、3.3.4 声明,2 字段(成员变量)若没有足够理由,不要把实例变量或类变量声明为公有。公共和保护的可见性应当尽量避免,所有的字段都建议置为私有,由获取和设置成员函数(Getter、Setter)访问。不允许“隐藏”字段,即给局部变量所取的名字,不可与另一个更大范围内定义的字段的名字相同(或相似)。例如,如果把一个字段叫做 firstName,就不要再生成一个局部变量叫做 firstName,或者任何易混肴的名字,如 fistName。一行代码只声明一个变量,仅将一个变量用于一件事。,3.3.4 声明,声明顺序:常量 类变量 公有字段 受保护字段 私有字段,3.3.5 语句结构,在设计阶段确定

27、了软件的逻辑流结构,但构造单个语句则是编码阶段的任务。语句构造力求简单,直接,不能为了片面追求效率而使语句复杂化。,1.程序编写首先应当考虑清晰性,程序编写首先应当考虑清晰性,不要刻意追求技巧性,使程序编写得过于紧凑。例如,有一个用 C 语句写出的程序段:AI=AIAT;AT=AIAT;AI=AIAT;,此段程序可能不易看懂,有时还需用实际数据试验一下。实际上,这段程序的功能就是交换AI和AT中的内容。目的是为了节省一个工作单元。如果改一下:WORK=AT;AT=AI;AI=WORK;就能让读者一目了然了。,2.程序要能直截了当地说明程序员的用意。,程序编写得要简单,写清楚,直截了当地说明程序

28、员的用意。例如,for(i=1;i=n;i+)for(j=1;j=n;j+)Vij(ij)*(ji)除法运算()在除数和被除数都是整型量时,其结果只取整数部分,而得到整型量。,当 ij 时,i/j=0 当 ji 时,j/i=0 得到的数组 当ij时 Vij=(ij)*(ji)=0 当ij时 Vij=(ij)*(ji)=1这样得到的结果 V 是一个单位矩阵。,写成以下的形式,就能让读者直接了解程序编写者的意图。for(i1;i=n;i+)for(j1;j=n;j+)if(i=j)Vij 1.0;ELSE Vij 0.0;,3.除非对效率有特殊的要求,程序编写要做到清晰第一,效率第二。不要为了追求

29、效率而丧失了清晰性。事实上,程序效率的提高主要应通过选择高效的算法来实现。4.首先要保证程序正确,然后才要求提高速度。反过来说,在使程序高速运行时,首先要保证它是正确的。,5.避免使用临时变量而使可读性下降。例如,有的程序员为了追求效率,往往喜欢把表达式 AI1AI;写成 BAI;XB1B;这样将一句分成两句写,会产生意想不到的问题。,6.让编译程序做简单的优化。7.尽可能使用库函数8.避免使用空的ELSE语句和IF THEN IF的语句。这种结构容易使读者产生误解。例如,if(char=a)if(char=z)printf(“This is a letter”);else printf(“T

30、his is not a letter”);可能产生二义性问题。,9.避免采用过于复杂的条件测试。10.尽量减少使用“否定”条件的条件语句。例如,如果在程序中出现 if(!(char0|char 9)改成 if(char=0&char=9)不要让读者绕弯子想。,12.不要修补不好的程序,要重新编写。也不要一味地追求代码的复用,要重新组织。13.对太大的程序,要分块编写、测试,然后再集成。,3.4 编程前的准备,为了保证开发成果的质量,提高开发效率,防止错误发生,在实际进行程序编制之前应作如下方面的准备。制定标准(工作标准和编程基准);知识共享;共享数据准备;(4)代码版本控制(5)综合利用开发

31、环境;,3.4.1 确定标准,1、工作标准的制定在准备阶段,所制定的工作标准包含的内容有:详细设计书的标准、程序设计的标准以及共有资源利用的规定(开发用的数据库、共用子程序库、临时文件)。2、编码标准的制定,3.4.2 知识共享的准备,(1)事前的人员教育,(2)开发组织的知识共享,专家协作,共享知识,讨论,回答,回答结果,3.4.3 共享数据的准备,共享数据准备的内容有:开发测试用的用户登录的帐号。数据库的安装。通用子程序、类库的封装。出错处理体系化 全局变量、常量,3.4.4 代码版本控制,主流版本控制软件介绍:Borland Starteam 是一个集合了版本控制、构建管理(BuildM

32、anagement)和缺陷跟踪系统为一体的软件,并且具有强大的图形界面,易学易用;但管理复杂、维护困难。PVCSVersionManager是美国的MERANT公司软件配置管理工具PVCS家族中的一个组成部分,它能够实现源代码、可执行文件、应用文件、图形文件和文档的版本管理;它能安全地支持软件并行开发,对多个软件版本的变更进行有效的控制管理。ClearCase是IBM ROSE构件的一部分,主要应用于复杂的产品发放、分布式团队合作、并行的开发和维护任务。可以控制word,excel,powerpoint,visio等文件格式,对于不认识的格式可以自己定义一种类型来标识。VisualSource

33、Safe(VSS)简单易用、方便高效、与Windows操作系统及微软开发工具高度集成。,CVS(ConcurrentVersionsSystem)是开发源码的并发版本系统,它是目前最流行的面向软件开发人员的源代码版本管理解决方案。它可用于各种平台,包括Linux、UnixWindowsNT/2000/XP等等。SVN(SubVersion)CVS 的主要作者(Fogel 等等)在他们现任公司的资助下开发了SubVersion用以替代CVS。SubVersion 的设计目的就是针对CVS 的一些弱点进行改进。前面三种是重量级的商业版本控制工具,更适合庞大的团队和项目,并且价格不菲。VisualS

34、ourceSafe是微软的产品,当然只能用在windows平台并与微软的开发工具无缝集成。CVS和SVN免费开源。,3.4.4 代码版本控制,版本控制的基本操作:1 检入(Check in)2 检出(Check out)3 更新(Update)4 同步(Synchronization),3.4.4 代码版本控制,版本控制有如下好处:便于团队代码共享保证整个团队使用统一的代码版本能获得版本控制工具中保存的任何版本能够把出错或误操作的最新版的项目恢复到正确的历史版本,3.5 编程实施,1 编码2 代码的检查为了保证编码之后的程序的质量,应当由对开发语言的知识了解和开发经验比较丰富的开发者进行代码的检查。代码的检查是对程序进行的静态分析,静态分析包括二个方面的内容,编码的标准的检查,执行效率不高和不适当的代码修正,这两点是代码检查的目的。,3.5 编程实施,3 调试调试应注意程序调试、数据库调试、网络调试三个方面,并尽可能发现瓶颈,找到导致性能恶化的原始原因的瓶颈。,3.5 编程实施,程序的调试,3.5 编程实施,数据库的调试,3.5 编程实施,网络的调试,3.5 编程实施,4 成果提交 源代码、B票、PCL,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号