软件制造工程编程工程.ppt
软件制造工程,第三章 编程工程,主要授课内容,编程工程概要结构化编程面向对象编程编程团队的计划过程编程前的准备过程程序开发规范编程的实现过程,编程工程概要,编程工程就是用程序设计语言把程序设计的结果和过程翻译为在计算机相应环境下可运行的软件产品,把系统工程师按照用户需求设计出来的系统构架变为真正可运行的软件系统的工程。,编程工程概要,编程工程的作业内容详细地划分为制定工作标准,制定编码基准,理解设计书,程序编码,自查,送上级系统工程师审查,修改以及进行单元测试等若干步骤,,结构化编程_结构化开发过程,结构化开发结构化分析结构化设计结构化编程,结构化编程_结构化开发过程,结构化编程_结构化开发过程,1、结构化分析核心是沿数据流程图自顶向下、逐步求精,是最经典的面向数据流的需求分析方法。,使用系统流程图、数据流图、数据字典、E-R图等工具来描述系统的功能需求、数据需求、运行需求和系统扩充需求。该方法广泛应用于银行,证券,商务处理、生产管理等大中型信息管理系统的需求分析过程。,在软件系统开发的初期阶段,首先要对用户的现行业务运行系统进行调查和现状分析,把握用户对新的开发系统的要求和希望,从用户提供的基本信息中,整理出开发系统目的和可能实现的功能范围,设计出新系统的数据流程图(DFD:Data Flow Diagram),显示屏幕关连图和功能概要说明书。,结构化编程_结构化开发过程,结构化编程_结构化开发过程,2、结构化设计以分析阶段获得的系统的数据流图(DFD)和显示屏幕关联图为基础,通过一系列映射,自顶向下,逐步细化,把它们变换为具体的程序概要结构图和屏幕设计式样,把一个个复杂的问题分解细化为由多个功能模块组成的具有层次结构的软件系统。,结构化编程_结构化开发过程,3、结构化程序制造由结构化程序设计和结构化程序编码组成它以软件结构图及其相关设计资料为基础,采用自顶向下,逐步细化的方法,把一个个模块的功能逐步分解,细化为一系列具体的步骤,作出结构化程序设计书,程序员再按照程序设计书和系统设计的相关资料,把一步步的处理说明翻译成一系列用某种程序设计语言编写的程序代码。,结构化编程_分析、设计文档与编程,结构化分析、设计的成果文档 系统功能概要说明书 程序名称一览表业务处理概要图(ER图)公共子程序设计说明书显示屏幕关联 图程序功能结构图屏幕设计式样书 程序设计说明书数据库设计说明书 程序处理追加功能说明书代码设计说明书模块功能的定义说明书输入输出文件设计说明书 输入数据检查说明书各文档与编程的关系?,结构化编程_分析、设计文档与编程,在进行程序编码工作的初期,程序员首先要获取系统功能概要说明书、业务处理概要图(DFD图或者E-R图)、显示屏幕关联图和程序名称一览表理解开发系统的目的、整体要素和各个子系统的处理要求。,结构化编程_分析、设计文档与编程,程序编码的主要依据是程序设计说明书在编写程序代码之前,程序员首先要确认自己所要编制的程序名称,获取该程序的程序设计说明书,理解该程序的程序功能概要和各个模块的详细处理说明,确定该程序所要使用的屏幕和报表的名称,数据库表和输入输出文件的名称,以及调用公共子程序的名称,找出所有相关的设计资料,充分理解程序设计说明书的内容,若有疑问或不明白的地方,要提出问题,与系统设计人员进行交流确认。,结构化编程_分析、设计文档与编程,在正确理解程序设计说明书的基础上,构思出结构化程序的框架,必要时作出程序处理流程图。使用语言编写程序代码时,确认各个数据项目的变量名称。需要调用公共子程序时,要获得公共子程序的代码或者可执行文件,做好输入输出参数的设置和返回值的判断处理。,结构化编程_分析、设计文档与编程,需要获得编码测试基准、共通处理说明书和代码设计说明书、获取相应的例子程序。在正确理解编码测试基准的基础上,进行程序编码和编码完成后的单元测试。,结构化编程_分析、设计文档与编程,在进行组合测试之前,需要获取系统功能概要说明书、数据流图、编码测试基准和共通处理说明书,把握各个子系统的处理流程和各个程序单元之间的接口,确保实现整个系统的设计功能。,作为软件制造工程的一个重要阶段,程序编码是程序设计的继续。,结构化编程_编码,结构化编程_编码,程序代码的质量与软件系统外部设计和内部设计的质量直接相关,同时,程序设计语言的特性和程序员的编码水平,程序代码的可读性,可维护性,可靠性,可测试性都是直接影响程序质量的因素。,结构化程序设计语言的特点是具有很强的过程控制能力和数据结构处理能力,并提供结构化的逻辑构造。目前,常用的结构化语言有C,PASCAL等。它们主要用于教学,系统软件开发,大型应用软件的服务器端的系统控制和数据处理等。,结构化编程_编码,结构化编程_编码,结构化编码采用自顶向下,逐步细化的方法,先全局,后局部,先整体,后细节,先抽象,后具体,逐步求精,编制出来的程序具有清晰的逻辑层次结构,容易阅读、理解、修改和维护,可以提高软件质量,提高软件开发的成功率和生产性。,逐步细化的例子 例1 在一组数中找出其中的最大数解:第一步:1 输入一组数2 找出一个最大数3 输出最大数第二步:2.1 任取一个数,假设它是最大数2.2 将该数与其余各数逐一比较;2.3 若发现有任何大于该一假设的最大数,即取而代之第三步:1.1 输入一个数组;2.1.1 令“最大数”=数组的第一个元素;2.2.1 从第二个元素至最末的一个元素依次做:2.3.1 如果新元素”最大数”则“最大数”=新元素;3.1 输出“最大数”,结构化编程_编码,结构化编码过程中,要遵循以下几个主要的原则:尽可能使用语言提供的基本控制结构,顺序结构、选择结构和重复结构。选用的控制结构只准许有一个入口和一个出口。利用程序内部函数,把程序组织成容易识别的内部函数模块,每个模块只有一个入口或一个出口,一般不超过200行。,结构化编程_编码,结构化编码过程中,要遵循以下几个主要的原则:复杂结构应该用基本控制结构组合或嵌套来实现。尽可能减少GOTO语句的使用,一般限制用到以下两种情况:把控制转移到出错处理。把控制转移到函数模块结束,大量采用GOTO语句实现控制路径,会使程序路径变得复杂而且混乱,但有时完全不用GOTO语句,可能会增加程序实现的复杂度。例如,在查找结束时、文件访问结束时或出现错误情况要从循环中转出时,使用GOTO语句会使程序更加清晰易懂。所以,应该加以限制地使用GOTO语句。,结构化编程_编码,结构化编程_编码,例1,使用C语言编写下面的一个小程序,目的是打印出A,B,C三个数据中的最小数,如P64图3.2给出了程序流程图。程序段1、程序段2 比较,例1 打印A,B,C 三数中最小者程序,【程序1】#include stdio.hint main(int argc,char*argv)int a=5,b=8,c=3;if(a b)goto T110;if(b c)printf(b=%dn,b);goto T130;else goto T120;T110:if(a c)printf(a=%dn,a);goto T130;T120:printf(c=%dn,c);T130:return 0;,上述的【程序段1】中,出现了多个GOTO语句,虽然程序功能是正确的,程序员在程序编码时也算下了工夫,但该程序的结构混乱,不易修改,可读性差。,【程序段2】#include stdio.hint main(int argc,char*argv)int a=5,b=8,c=3;if(a b,【程序段2】的结构清晰,可读性好。修改a,b,c的值,可以测试该程序段的各个分支。,结构化编程_编码,在结构化程序的实现方法中,有两种常用的基本方法,第一是分类(BREAK)处理,第二是匹配(MATCHING)处理。,BREAK方法的引入:问题:根据学生成绩文件,统计各班的平均分,并输出到班级平均成绩文件中?,程序处理过程(PDL代码):读入学生成绩文件的第一个记录;beforeKey=这个纪录的班级编号;sum=这个纪录的成绩;n=1;while(学生成绩文件没有结束)读入下一个学生成绩记录;afterKey=这个纪录的班级编号;if(afterKey=beforeKey)sum+=这个纪录的成绩;n+;else 输出sum/n到班级平均成绩文件;beforeKey=afterkey;sum=这个纪录的成绩;n=1;输出sum/n到班级平均成绩文件;,Break方法处理概要,结构化编程_编码,BREAK方法的前提条件是:在进行BREAK处理之前,输入文件必须是已经按照关键字项目值进行排序(升序或者降序)处理好的。,结构化编程_编码,BREAK方法的处理概要如下,处理流程见P66图3.4:按关键字项目值的升序读入输入文件的记录,把关键字项目的值存入工作变量中。关键字项目的值相同时,进行统计处理(或者其他处理)。,结构化编程_编码,BREAK方法的处理流程说明:关键字项目的值发生了变化(BREAK)的时候,把变化前(BREAK BEFOR)的关键字项目值和统计结果输出到文件中(或者其他处理),用变化后(BREAK AFTER)的关键字项目值替换变化前的关键字项目值。读入输入文件的下一条记录,把关键字项目的值存入变化后的工作变量中。继续进行上述至的处理,直至文件读入结束。,图3.4 BREAK处理流程,汇总处理,学生名称文件,学生成绩文件,学生成绩汇总文件,MACHING方法的引入:问题:读入学生名称文件和学生成绩文件,把相同编号的数据记录结合起来,输出到学生成绩汇总文件中?,程序处理过程(PDL代码):读入学生名称文件的第一个记录;bKey=这个纪录的学号;读入学生成绩文件的第一个记录;tKey=这个纪录的学号;while(学生成绩文件没有结束)if(bKey=tKey)输出bKey记录的学号、姓名和tKey记录的单科成绩和总成绩 到学生成绩汇总文件中;读入下一个学生成绩记录;tKey=这个纪录的学号;else if(bKey tKey)读入下一个学生名称记录;bKey=这个纪录的学号;else 输出错误信息(学号为tKey的学生记录在学生名称文件中没有);读入下一个学生成绩记录;tKey=这个纪录的学号;,MACHING方法处理概要,3.2.2 结构化编码,MATCHING方法的前提条件:在进行MATCHING处理之前,输入文件必须是已经按照关键字项目的值进行排序(升序或者降序)处理好的。,结构化编程_编码,MATCHING方法处理概要说明如下:按关键字项目值的升序读入基础文件的记录,把关键字项目的值存入基础KEY工作变量中。按关键字项目值的升序读入事务文件的记录,把关键字项目的值存入事务KEY工作变量中。基础KEY的值与事务KEY值相等时,把事务文件的数据编辑输出到文件中。读入事务文件的下一条记录,把关键字值存入事务KEY。,结构化编程_编码,基础KEY的值大于事务KEY值的时候,把事务KEY的值写到错误信息文件中。读入事务文件的下一条记录,把关键字值存入事务KEY。基础KEY的值小于事务KEY值的时候,读入基础文件的下一条记录,把关键字值存入基础KEY。继续进行上述至的处理,直至文件读入结束。1:1的匹配处理的情况下,上述处理读入事务文件的同时,还要读入基础文件,MATCHING处理流程,案例某个项目中有这样一个需求:将某些Word文档生生导入到系统的数据库中。这个需要是合理的,该文档是流程中的一个重要附件。重复录入不仅意味着用户需要多输入一遍,而且还增加了录入错误的风险。所以,我很乐意支持这个需求,它将让我们的系统增加一份稳定性和正确性。其中有一个文档是这样的:,在20世纪80年代之前,应用软件的开发一般都采用结构化的程序设计方法,其基本思想是“自顶向下、逐步求精”,即将一个复杂的规模较大的应用软件划分为若干个相对独立的功能模块,然后对各个模块编写代码,最后通过模块间的调用实现软件系统的运行。结构化程序设计极大地提高了软件生产率,是程序设计的基石。,但随着计算机应用的深入和发展,问题规模越来越大,软件复杂性也大幅度提高,使结构化程序设计产生了两个问题:(1)编程人员始终要考虑程序代码执行的顺序及条件,即程序的过程问题,这样他们往往陷于大量而且复杂的分支、循环等控制结构中,当程序的规模增大到一定程度时,程序过程的控制难以准确地实施,加大了程序编制的难度,程序的可靠性就降低了;,但随着计算机应用的深入和发展,问题规模越来越大,软件复杂性也大幅度提高,使结构化程序设计产生了两个问题:(2)程序代码与处理的数据分离,一旦应用需求发生变化,花大量力气编制的程序却几乎不能重用或移植,因此代码可重用性低,不能有效地提高程序的开发效率。针对以上问题,提出了面向对象的程序设计方法。,面向对象的编程_什么是面向对象,面向对象(object-oriented或object-orientation)不仅是一些具体的软件开发技术与策略,而且是一整套关于如何看待软件系统与现实世界的关系,以什么观点来研究问题并进行求解,以及如何进行系统构造的软件方法学。,面向对象的编程_什么是面向对象,面向对象方法的基本思想是,从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式。关键:对象 问题域面向对象方法的扩展编程分析、设计,面向对象程序设计是利用人们对事物进行分类的自然倾向,将一些公用的软件模块“类”化,由类引申出具体的对象。克服了面向过程程序设计的缺点,其基本思想是以数据为中心,将数据与程序封装于对象之中,淡化了解决问题的过程和步骤,有效降低了程序开发的逻辑复杂性,使程序易于理解和测试;另一方面,由于对象具有相对独立性和通用性,因而提供了代码复用的可能,提高了程序的开发效率。,传统的软件工程方法与面向对象的软件工程方法,面向对象的编程_面向对象编程,OOP=OOI基本概念对象属性与服务类封装继承消息结构与连接多态,编程团队的计划过程,在编程阶段,小组成员已经经历了程序设计阶段,此时,小组成员对所作的软件项目(或产品)、模块有了一个更清晰的认识和更深刻的理解,有了更多的实际工程数据。这样,在编程阶段就需要利用程序设计阶段获得的实际工程数据来更新或重新制订团队的工程计划,包括小组任务表,日程计划表,质量计划等。使用及时更新的工程计划指导编程团队按质按量地实现软件系统。,编程团队的计划过程,这一部分主要在重新对软件模块规模和时间进行更精确估计的基础上,重新对团队成员的任务进行了分配,并调整了团队的质量计划,制定了工程师个人计划,以及如何跟踪编程团队的工程计划,保证工程计划有效地指导整个编程团队。,编程团队的计划过程,角色重新分配模块规模估计任务分配质量计划制定工程师个人计划工程计划跟踪,编程团队的计划过程_角色重新分配,角色重新分配的流程一般为:首先工程师(或学生)填写和提交INFO表格,此表格上表明了哪些工程师的日程安排是相容的,谁对哪个角色更感兴趣,以及每个工程师的背景和经验;,编程团队的计划过程_角色重新分配,角色重新分配的流程一般为:然后项目经理(或教师)根据前一阶段每个人的表现和个人能力和兴趣,重新对小组成员的角色进行分配。现假定编程团队共有五个人,他们分别是小王、小张、小李、小刘和小赵,他们的角色分配如下图所示。编程团队角色分工之后,小组领导和计划经理领导全体组员进行任务分配,质量/生产经理领导小组重新调整质量计划。,编程团队的计划过程_角色重新分配,编程团队的计划过程_模块规模估计,在分配任务之前,计划经理领导小组重新估计每个模块的规模,程序设计之后,工程师们对软件的每个模块的处理流程和算法有了更准确和深入的认识,这时需要对软件的每个模块的规模做出更准确的估计,作为下一步任务分配的主要依据。以前一章的学生成绩管理系统为例,此系统的四个模块需做规模估计。规模小结表(SUMS),编程团队的计划过程_任务分配,对模块规模重新估计完之后,小组领导和计划经理领导小组把需要做的工作进行列表,估计每一项工作大概需要多少时间,再把这些信息记入任务(TASK)表格,最好记下每个工程师完成每项工作的预计时间。然后,估计要完成工程的话,整个小组每周所需的工作时间,把这些信息记入日程计划(SCHEDULE)表格。完成这一切之后,计算出计划价值PV和每一项工作预计完成时间,填入TASK表格中。,编程团队的计划过程_任务分配,在编程阶段,每个模块都需要经历五个阶段:详细设计检查、代码编写、代码复核、编译和代码检查。所以,每个模块都对应有五个任务。学生成绩管理子系统在编程阶段的任务表、日程计划表,考虑一项“管理和杂物工作”任务,以备不时之需。建议在总工程计划时间里留出5%到10%的余量。这样,无论何时你再遇见未计划的工作,你都可以为这些管理和杂物工作取得获得价值EV了。,编程团队的计划过程_质量计划,在编程阶段,在程序设计的基础上,重新调整质量计划,使其更加适合指导软件开发过程。要制订质量计划,应当从估计编程工程的各个阶段(详细设计检查、代码编写、代码复核、编译和代码检查)可能出现的产品缺陷开始。接着,再制定出每个除去缺陷阶段的成品率目标。最后,要得到一个试行的质量计划,看一看它是否满足要求。如果它不满足的话,就对原计划进行调整,以得到一个新的试行计划。按照下面的步骤进行。,编程团队的计划过程_质量计划,1、估计在每个阶段可能引入多少产品缺陷。这个估计应当以所用的时间乘以缺陷引入率为基础得到。在编程阶段,一般主要缺陷来自于代码编写阶段。,编程团队的计划过程_质量计划,2、估计每个除去缺陷阶段小组将得到的成品率级别。阶段成品率指的是一个程序在一个给定的阶段内去掉的缺陷的百分比。因而,如果你的一个程序在代码复核开始时有19个缺陷,在代码复核时引入了1个缺陷,同时又找到15个缺陷的话,你就有一个75%的代码复核成品率。也就是成品率=100*(找到的缺陷数)/(产品的缺陷数)=100*15/(19+1)=75%.同样的公式可以应用于任何过程阶段。,编程团队的计划过程_质量计划,3、根据任务表中任务预计规模和任务预计时间值,以及每个阶段的缺陷引入率和阶段成品率,计算质量计划表的其他项目,得到一个试行质量计划。,编程团队的计划过程_质量计划,4、把这个试行质量计划中的数据和之前制订的TSP质量标准作比较。如果总缺陷率不在预定的学过PSP的工程师应达到的级别范围内,那么就增加或是减少编程阶段的时间,调整一个或更多的阶段中引入的缺陷数。这项工作要一直进行到总缺陷率在预定范围内为止。,编程团队的计划过程_质量计划,5、如果缺陷除去率和复核检验率与标准相去甚远,那么调整缺陷除去阶段的时间或者是改变缺陷调整阶段的成品率目标,直到这些数值与标准相近为止。对应过程表格,编程团队的计划过程_制定工程师个人计划,质量计划制定完之后,给每一个工程师一份TASK和SCHEDULE表格的副本,并要求每个工程师都做出自己的TASK和SCHEDULE表格。如果你在小组任务表中记录过每一个工程师预计完成每一项工作的时间的话,这一步就只需要每一个小组成员删去别人将要做的工作,再调整SCHEDULE表格使之反应他(她)个人每周工作日程就行了。,编程团队的计划过程_工程计划跟踪,跟踪一个工程计划的目的是,确定工程进行的程度和质量。在编程阶段,工程师必须定期地向经理们递交报告,说明他们是否在按时间表行事以及他们预计将在何时完成工作。工程师在按照任务计划执行时,需要完成以下工作,对编程阶段的质量和进度进行跟踪。,编程团队的计划过程_工程计划跟踪,1、在时间记录表(LOGT)中记录时间。当你在时间纪录表中记录时间时,这些时间数据将用于更新你个人的TASK表格里的实际时间,以及你的SCHEDULE表格中每周实际工作时间。例如,计划经理小王的时间记录日志(从2007/1/15-2007/1/26),编程团队的计划过程_工程计划跟踪,2、记录工作完成的周数。无论工程师何时完成了一项工作,工程师都要在TASK表格中记录下它完成的周号,更新EV值。然后,输入WEEK表格中需要的数据,制作一份副本给计划经理,计划经理及时更新团队的TASK表和SCHEDULE表。,编程团队的计划过程_工程计划跟踪,3、工程师在详细设计检查、代码复核、编译和代码检查时,将发现的缺陷填入在缺陷记录表(LOGD)中。这些数据以备日后进行分析。程序设计员的一个共同特点是,他们都会引入很多缺陷,在编写代码的过程中6个缺陷/小时很正常,对于没有经验的工程师,这个比率会更高。有了实际的缺陷数据之后,就可以计算出缺陷比率、缺陷数/KLOC、缺陷引入比率和缺陷除去比率等。质量经理根据这些数据深入分析编程阶段的质量。,编程团队的计划过程_工程计划跟踪,例如,经验表明,如果工程师们在代码复核阶段发现的缺陷数大于编译阶段的两倍,这说明他们的代码复核做的很成功。如果质量经理小刘在代码复核是发现了一个变量没有初始化,他需要将此缺陷的类型、引入时间和处理时间等信息记录下来,编程团队的计划过程_工程计划跟踪,4、记录每一部件的规模。工程师在开发出一个产品元件之后,一定要把它的规模大小计入相应部分的SUMS表格中。例如,源程序代码的LOC数等。,编程团队的计划过程_工程计划跟踪,5、更新计划小结(SUMP)里的实际数据。根据日志记录表和缺陷记录表的数据,更新SUMP表里与编程阶段相关项目的实际值。例如,学生成绩管理子系统在编程阶段结束后,它的计划小结如表所示。注意:在表中打*号的是与编程阶段相关的项目,为了突出与编程阶段相关的计划小结内容,其他阶段的计划值和实际值都没有给出。,编程团队的计划过程_工程计划跟踪,6、更新质量计划表里的实际数据。只要有了实际的时间、规模和缺陷数据,就可以计算出质量计划表里的实际值,将这些值与TSP质量标准作比较,深入分析编程阶段的代码质量和质量计划的执行效果,这些数据可作为下一测试阶段的工程计划的数据来源和依据。,编程的准备过程,工作标准的制定知识共享的准备数据共享的准备综合开发环境程序开发规范代码版本控制,编程的准备过程_工作标准的制定,实际编程工作开始前、为了保证开发成果的质量,系统的开发环境和标准化的工作流程应该有机地结合起来,把编程作业从头到尾的过程归纳为标准化的模式,开发者都必须按照这个标准化模式进行工作,这样可以抑制和防止最终开发成果因人而异造成的差异,防止错误发生,提高生产效率,确保程序编制的质量。在项目开发之前,从事开发工作的管理者必须把业务工作的次序、流程和最终开发成果的格式按标准化模式作出开发基准,以取得一致的开发成果。,编程的准备过程_工作标准的制定,在准备阶段,所制定的工作标准包含的内容有:详细设计书的标准、程序设计的标准以及共有资源利用的规定-工作标准的制定内容注意:要根据客户的要求、检查自己制定的开发标准与客户提出的开发标准是否一致,决定是选用客户的开发标准或者采用自己的开发标准。工作标准的制定和整理是从事工程管理的管理者的重要任务,程序员必须认识到它的必要性,严格地按照每一步工作流程进行开发,细心地遵守每一条开发标准,编程的准备过程_知识共享的准备,使用新技术的开发过程中,为了避免程序编制技能的不平衡,有必要对开发人员进行统一培训,因此培训教育计划也作为项目开发的一部分。项目开始后发生的各种问题以及问题的解决方法要作为共通问题通报给各个开发小组,这样以防止同样的错误再发生。事前人员教育、开发组织知识共享,编程的准备过程_共享数据的准备,编程工作开始前,必须构筑全部程序员共享的数据库等资源,集中管理这些共享资源的场所叫做数据库。数据库里必须准备的项目是内部设计时作为共享资源定义的全部项目。如果设计书没有指出,在编程工作展开时也要列举出必要的资源并做好相应的准备。,编程的准备过程_共享数据的准备,共享数据准备的内容有:开发测试用的用户登录的帐号。数据库的安装。数据库接口定义;全领域(数据领域、Log日志领域、索引领域等)的长度定义;作成各领域的物理文件、物理盘分配的定义;详细层的数据定义(全索引各TABLE、COLUMN、VIEW等);建立数据结构之间的关系。,编程的准备过程_共享数据的准备,共享数据准备的内容有:通用子程序、类库的封装。在现有子程序、类库的功能的调查基础上确定可利用的通用子程序和类库;新建子程序的粒度定义。从功能的观点决定子程序到哪层为止;是否分割、是否综合、能否归纳到1个类库中;通用子程序、类库实装,编程的准备过程_共享数据的准备,共享数据准备的内容有:出错处理体系化出错内容的整理。参照现行系统整理错误内容;错误处理的分类;异常处理类的设计;错误信息标准化(决定错误信息的编号体系、决定错误信息的分类显示方法、错误信息的格式定义以及错误信息格式定义的例子);错误信息显示处理的实现(把错误信息的显示处理作成通用的子程序)。,编程的准备过程_共享数据的准备,共享数据准备的内容有:全局变量、常量整理出必要的全局变量、全局常量;全局变量、常量的命名。,编程的准备过程_综合利用开发环境,在综合利用开发环境方面,我们可以将编程过程划分为:Coding(编码),Debug(调试)两个阶段,,编程的准备过程_综合利用开发环境,编程的准备过程_综合利用开发环境,版本的统一开发组在应用同一综合开发环境的时候,应事先统一版本,如果版本不完全一致的话,执行模块及动态链接库工作时就会产生异常。此外,子程序也可能在不断更新换代,所以,应尽可能利用加载了最新子程序的测试环境。,编程的准备过程_综合利用开发环境,用户设定的统一尽管多数开发环境都允许用户自由设定显示颜色,嵌套格式等部分内部参数,但为了严格遵守编程标准,应事先对(这些环境的)用户设定进行统一。实际上,由于可能有多个程序员使用1台PC(开发设备),所以最好事先使开发环境一致,这样才能保证其安全运行。,编程的准备过程_综合利用开发环境,在系统开发的全过程中,根据与支持任意一种过程的功能相结合的重要程度,主要分为三类综合开发环境,编程的准备过程_综合利用开发环境,编程的准备过程_综合利用开发环境,上流工程综合型上流工程综合型是支持外部设计和内部设计的功能,以综合开发环境作为平台的综合开发环境。随着UML(统一建模语言:Unified Modeling Language)文档出现,C+,Java等各种语言的基类定义自动生成工具也因此而得以普及。利用上流工程综合型的好处在于,能够排除内部功能设计与程序实现间的交流的障碍,从而使编程工作过程中的效率得以大幅提高,工作量得以减少。,编程的准备过程_综合利用开发环境,运用环境综合型这里指的是运用环境同综合环境结合在一起的开发环境,它不生成在操作系统上能单独运行的可执行文件,而是只在特定的运用环境下才能运行的程序的开发环境。如ERP开发环境下的专用开发语言(例如:SAP、R/3的ABAP等),由于只部署在那些特定环境下运行的程序,所以被称为前面所说的同中间件产品相结合的运用环境综合型,由于Lotus Notes等的组件内已集成了程序执行所需的专用软件,因此它也属于这种类型。几乎所有的通过编译器或者向中间语言翻译的方式得到程序的可执行形式,都属于此类型。,编程的准备过程_综合利用开发环境,运用环境综合型运用环境综合型的优点有:提供运用环境的用户管理功能,系统监视功能,实时管理功能,工作及日程安排功能,在充分发挥这些功能优点的同时,运用部分的代码随之就能得到省略。,编程的准备过程_综合利用开发环境,单独型不含在上述两类任何一个类的单独的综合开发环境,称之为单独型,这就是通常所说的典型的产品开发环境。他可以生成能单独运行的可执行文件。(称为RAD(Rapid Application Development)工具),多数支持顶层设计的包,都包含在这些产品及相关的加强版本功能中。,编程的准备过程_综合利用开发环境,单独型单独型的优点是,能够开发出不依赖于操作环境的程序,为了提高编程效率而提供的支持功能非常强大。,编程的准备过程_程序开发规范,编码标准的内容 Java编程规范C+编程规范,编程的准备过程_代码版本控制,版本控制的好处:可以获得连续的受版本控制的项目,并保存不同版本的区别以作比较能获得版本控制工具中保存的任何版本能够把出错或误操作的最新版的项目恢复到正确的历史版本获得历史版本的详细信息,编程的准备过程_代码版本控制,Visual SourceSafe(VSS):防止用户文件意外丢失,并能对以前版本跟踪;对源文件进行分支(branch)、共享(share)、合并(merge)操作,同时对整个项目进行版本控制。文件保存在网络上的一个中央数据库中,而不是保存在一个普通的文件夹下。当通过Visual SourceSafe观看时,这个数据库看上去包括了以项目层次树方式组织的所有文件和历史记录。,编程的准备过程_代码版本控制,当获得了一个文件时,Visual SourceSafe会在它的数据库中将该文件标记为已被你签出(Check out),而后允许你在你的机器上对该文件进行修改。当将文件签入(Check in)时,Visual SourceSafe会更新它的数据库并把机器上的该文件的访问权限改回为只读。,编程的准备过程_代码版本控制,针对每一个改动,Visual SourceSafe数据库都会记录和跟踪项目信息。每当从项目中添加了一个文件,修改了一个文件或者共享、移动、删除了一个文件,Visual SourceSafe都会同时共享文件和项目的历史记录。,编程的准备过程_代码版本控制,在开发之前先从VSS服务器上获得最新版本的源代码,对代码做修改之前先要签出(Check out),在代码修改完成之后签入(Check in)之前需要完成一系列的如下步骤:(1)从服务器上获得最新的源代码(获得最新版本,Get Latest Version)必须从服务器上获取整个项目的所有的源代码到本地,对于自己已经签出(Check out)的文件,VSS会提示是覆盖、不覆盖、还是归并。必须选择归并(Merge)。,编程的准备过程_代码版本控制,在代码修改完成之后签入(Check in)之前需要完成一系列的如下步骤:(2)重新编译本地的所有源代码(Rebuild All)允许签入(Check in)到服务器的源代码的最低要求就是能够通过编译,否则是不允许签入(Check in)的,同时最好能够去掉编译警告,编程的准备过程_代码版本控制,在代码修改完成之后签入(Check in)之前需要完成一系列的如下步骤:(3)代码审查(Code Review)在VSS中对签出(Check out)的文件选择版本比较(Show Difference),向自己的同事解释本次对源文件做的修改。同事帮助其确认是否的确解决了需要解决的问题、是如何解决的,以及算法是否还可以优化、代码是否符合编程规范、是否还有潜在的错误。,编程的准备过程_代码版本控制,在代码修改完成之后签入(Check in)之前需要完成一系列的如下步骤:(4)签入(Check in)完成了代码审查之后可以签入(Check in)源代码。如果代码审查的时间过长,则还需要重复做一次以获得最新的源代码和重新编译,来保证这段时间内别的同事所做的操作不会与自己做的操作发生冲突。,编程的准备过程_代码版本控制,(5)发签入(Check in)报告签入(Check in)之后需要给整个开发团队发一个报告,为的是让别的同事知道现在项目的进度。报告中必须注明:本次签入(Check in)的目的、和自己一起做代码审查的同事的名字、代码审查的具体内容、是否做过单元测试、签入(Check in)的所有文件的列表。,编程的实现过程,详细设计检查编写代码代码复核(检查)编译与调试单元测试模块质量复核结束标准,编程的实现过程_详细设计检查,详细设计检查在编写代码之前,让质量进度监督经理带领你和一两名小组成员来进行详细设计的检查。如果小组的生产超过70是一致的,那么你仅需要一名工程师来检查设汁,尽管这样简单的检查不需要质量生产经理参与,但你应将检查数据记入INS表格中,并将主要缺陷记入你的LOGD中,还要将几份完整的INS表格交给质量生产经理和小组领导人,以使其包括于工程笔记本中。,编程的实现过程_编写代码,编写代码编制出来的程序不仅逻辑正确,而且要结构清晰,容易阅读和理解,语句构造应力求简单,清晰,不要片面追求效率而使语句复杂化。,编程的实现过程_编写代码,作为程序员个人在编码前和编码过程中需要注意的:明确命名规则,明确程序注释规则 注意程序书写格式 所有的程序变量都必须先定义,后使用,尽可能减少全局变量、大容量数据缓冲区的定义和使用,动态分配的缓冲区使用结束时一定要释放空间,编程的实现过程_编写代码,编程技巧的发挥和值得注意的地方,从技术的角度说明,编程的实现过程_代码复核(检查),-查看缺陷史,判断你可能在编码中引入了多少缺陷。一种方法是列出你每小时编码可能引入的缺陷数量。还要确定对每一千LOC你所引入的缺陷数量,当你了解了你的历史上最大和最小的缺陷率之后,你能对程序中缺陷数量的范围有个好的估测。然后在编码复核中将目标定为发现这样数目的缺陷。,编程的实现过程_代码复核(检查),-为引导代码复核,设立一个时间目标。建议至少使用 50(最好是70)编程时间来复核。取代每次以同样的方式看代码,应每一次寻找不同的东西。某次检查名字一致性,然后检查初始化,标点,赋值和等式,然后是检查指针,调用顺序,以及包含。你要确信正使用你的检查清单来做向导。如果你正在发现缺陷,即使用了比计划更多的时间,也要继续进行下去。,编程的实现过程_代码复核(检查),-如果在复核中不能发现足够的缺陷,在编译代码之前请求其它开发经验比较丰富的工程师进行代码的复核。代码的复核是对程序进行的静态分析,静态分析包括二个方面的内容,编码的标准的检查,执行效率不高和不适当的代码修正,这两点是代码复核的目的。,编程的实现过程_代码复核(检查),-代码检查的内容,编程的实现过程_编译与调试,编译编译器最基本的任务是生成目标代码 编译器能标识出大部分语法缺陷,但是它不能辨别你的意图是什么。因此编译经常为那些看起来很简单的缺陷提供很多出错信息。另为,编译器只提供了缺陷的征兆,你必须自己对问题定位,并确定是什么问题。,编程的实现过程_编译与调试,调试主要是根据外部设计式样书记录的响应时间和处理时间来决定调试标准,首先找出导致程序性能恶化的主要原因,然后研究解决的办法。如果是在计算机网络的开发环境,由于测试环境,执行环境的差异,在联接测试之前是不能确认程序的实际性能的,但是对于模块的单元性能在联接测试之前是可以发现问题的。,编程的实现过程_编译与调试,调试_程序的调试,编程的实现过程_编译与调试,调试_数据库的调试,编程的实现过程_编译与调试,调试_网络的调试,编程的实现过程_单元测试,下一章专门讲解,编程的实现过程_模块质量复核,在编码检查和单元测试之后,让质量/进度监督经理复核这些模块数据来确定模块质量是否好到可包含进基准系统里。在这里的标准即是在质量计划阶段小组所建立的标准。,编程的实现过程_模块质量复核,模块质量复核的目标是,确信程序的每个逻辑段用执行表或追踪表至少分析过一次,而且,对每个有状态行为的程序段,确保至少分析检查过一次。当程序的逻辑特别复杂,或程序有许多缺陷时,让两名或者更多的工程师来进行同样的检查。并且,进行同样程序的不同分析时,使用不同的工程师。,编程的实现过程_结束标准,在完成编程阶段时,你必须有:完整的,被复核和检察过的模块;记入了配置管理系统的模块;为设计检查,代码检查以及再检查而完成的INS和LOGD表格系统和它的所有模块部分更新的SUMP,SUMQ和SUMS表格;单元测试计划和支持材料;大小,时间和缺陷数据;更新的工程笔记本。,编程实例分析,