软件制造工程第三章.ppt
软件制造工程软件制造工程 第三章第三章编程工程编程工程第三章第三章编程工程编程工程v编程工程的定义和内容编程工程的定义和内容v结构化编程结构化编程v编码规范编码规范v编程前的准备编程前的准备v编程实施编程实施3.1.1编程工程的定义和内容编程工程的定义和内容v编程工程编程工程就是用程序设计语言把程序设计的就是用程序设计语言把程序设计的结果和过程翻译为在计算机相应环境下可运结果和过程翻译为在计算机相应环境下可运行的软件产品,把系统工程师按照用户需求行的软件产品,把系统工程师按照用户需求设计出来的系统构架变为真正可运行的软件设计出来的系统构架变为真正可运行的软件系统的工程。系统的工程。3.1.1编程工程的定义编程工程的定义v编程工程的作业内容编程工程的作业内容详细地划分为制定工作详细地划分为制定工作标准,制定编码基准,理解设计书,程序编标准,制定编码基准,理解设计书,程序编码,自查,送上级系统工程师审查,修改以码,自查,送上级系统工程师审查,修改以及进行单元测试等若干步骤及进行单元测试等若干步骤.3.2结构化编程结构化编程v结构化开发结构化开发-结构化分析、结构化设计结构化分析、结构化设计和结构化编程三个阶段和结构化编程三个阶段3.2.1结构化开发过程结构化开发过程结结 构构 化化 编编程程结结 构构 化化 设设计计结结 构构 化化 分分析析需求分析需求分析/验收测试计划验收测试计划外部设计外部设计/系统测试计划系统测试计划内部设计内部设计/组合测试计划组合测试计划程序制造程序制造(编码编码&单元测试单元测试)验收测试验收测试组合测试组合测试系统测试系统测试3.2.1结构化开发过程结构化开发过程1、结构化分析、结构化分析v结构化分析方法的核心是沿数据流程图自顶向下、结构化分析方法的核心是沿数据流程图自顶向下、逐步求精,是最经典的面向数据流的需求分析方法。逐步求精,是最经典的面向数据流的需求分析方法。结构化分析方法使用系统流程图、数据流程图、数结构化分析方法使用系统流程图、数据流程图、数据字典、据字典、ER图、处理说明等工具来描述系统的功能图、处理说明等工具来描述系统的功能需求、数据需求、运行需求和系统扩充需求。该方需求、数据需求、运行需求和系统扩充需求。该方法广泛应用于银行,证券,商务处理,生产管理等法广泛应用于银行,证券,商务处理,生产管理等大中型信息管理系统的需求分析过程。大中型信息管理系统的需求分析过程。3.2.1结构化开发过程结构化开发过程v在软件系统开发的初期阶段,首先要对用户在软件系统开发的初期阶段,首先要对用户的现行业务运行系统进行调查和现状分析,的现行业务运行系统进行调查和现状分析,把握用户对新的开发系统的要求和希望,从把握用户对新的开发系统的要求和希望,从用户提供的基本信息中,整理出开发系统目用户提供的基本信息中,整理出开发系统目的和可能实现的功能范围,设计出新系统的的和可能实现的功能范围,设计出新系统的数据流程图(数据流程图(DFD:DataFlowDiagram),),显示屏幕关连图和功能概要说明书。显示屏幕关连图和功能概要说明书。3.2.1结构化开发过程结构化开发过程2、结构化设计、结构化设计v结构化设计方法通常也叫做面向数据流的设计、面结构化设计方法通常也叫做面向数据流的设计、面向行为的设计。结构化设计方法是以需求分析阶段向行为的设计。结构化设计方法是以需求分析阶段获得的新系统的数据流程图获得的新系统的数据流程图(DFD)和显示屏幕关连图和显示屏幕关连图为基础,通过一系列映射,自顶向下,逐步细化,为基础,通过一系列映射,自顶向下,逐步细化,把它们变换为具体的程序概要结构图和屏幕设计式把它们变换为具体的程序概要结构图和屏幕设计式样,把一个个复杂的问题分解细化为由多个功能模样,把一个个复杂的问题分解细化为由多个功能模块组成的具有层次结构的软件系统。块组成的具有层次结构的软件系统。3.2.1结构化开发过程结构化开发过程3、结构化程序制造、结构化程序制造v结构化程序制造由结构化程序设计和结构化程序编结构化程序制造由结构化程序设计和结构化程序编码组成,它以外部设计和内部设计过程中获得的软码组成,它以外部设计和内部设计过程中获得的软件结构图及其相关设计资料为基础,采用自顶向下,件结构图及其相关设计资料为基础,采用自顶向下,逐步细化的方法,把一个个模块的功能逐步分解,逐步细化的方法,把一个个模块的功能逐步分解,细化为一系列具体的步骤,作出结构化程序设计说细化为一系列具体的步骤,作出结构化程序设计说明书,程序员再按照程序设计说明书和系统设计的明书,程序员再按照程序设计说明书和系统设计的相关资料,把一步步的处理说明翻译成一系列用某相关资料,把一步步的处理说明翻译成一系列用某种程序设计语言编写的程序代码。种程序设计语言编写的程序代码。3.2.2结构化编码结构化编码v程序代码的质量与软件系统外部设计和内部程序代码的质量与软件系统外部设计和内部设计的质量直接相关,同时,程序设计语言设计的质量直接相关,同时,程序设计语言的特性和程序员的编码水平,程序代码的可的特性和程序员的编码水平,程序代码的可读性,可维护性,可靠性,可测试性都是直读性,可维护性,可靠性,可测试性都是直接影响程序质量的因素。接影响程序质量的因素。3.2.2结构化编码结构化编码v结构化编码采用自顶向下,逐步细化的方法,结构化编码采用自顶向下,逐步细化的方法,先全局,后局部,先整体,后细节,先抽象,先全局,后局部,先整体,后细节,先抽象,后具体,逐步求精,编制出来的程序具有清后具体,逐步求精,编制出来的程序具有清晰的逻辑层次结构,容易阅读、理解、修改晰的逻辑层次结构,容易阅读、理解、修改和维护,可以提高软件质量,提高软件开发和维护,可以提高软件质量,提高软件开发的成功率和生产性。的成功率和生产性。结构化编码过程中,结构化编码过程中,要遵循以下几个主要的原则要遵循以下几个主要的原则:尽可能使用语言提供的基本控制结构,顺序结构、尽可能使用语言提供的基本控制结构,顺序结构、选择结构和重复结构。选择结构和重复结构。选用的控制结构只准许有一个入口和一个出口。选用的控制结构只准许有一个入口和一个出口。利用程序内部函数,把程序组织成容易识别的内部利用程序内部函数,把程序组织成容易识别的内部函数模块,每个模块只有一个入口和一个出口,一函数模块,每个模块只有一个入口和一个出口,一般不超过般不超过100行。行。复杂结构应该用基本控制结构组合或嵌套来实现。复杂结构应该用基本控制结构组合或嵌套来实现。尽可能减少尽可能减少GOTO语句的使用,一般限制用到以下语句的使用,一般限制用到以下三种情况:三种情况:v把控制转移到出错处理。把控制转移到出错处理。v把控制转移到函数模块结束把控制转移到函数模块结束v从深层嵌套的循环退出从深层嵌套的循环退出3.2.2结构化编码结构化编码v大量采用大量采用GOTO语句实现控制路径,会使程语句实现控制路径,会使程序路径变得复杂而且混乱,但有时完全不用序路径变得复杂而且混乱,但有时完全不用GOTO语句,可能会增加程序实现的复杂度。语句,可能会增加程序实现的复杂度。例如,在查找结束时、文件访问结束时或出例如,在查找结束时、文件访问结束时或出现错误情况要从循环中转出时,使用现错误情况要从循环中转出时,使用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 endif3.2.3结构化编码结构化编码v在结构化程序的实现方法中,有两种常用的在结构化程序的实现方法中,有两种常用的基本方法,第一是分类基本方法,第一是分类(BREAK)处理方法,第处理方法,第二是匹配二是匹配(MATCHING)处理方法。处理方法。BREAK方法的引入方法的引入:问题问题:根据学生成绩文件,统计各班的平均分,并输:根据学生成绩文件,统计各班的平均分,并输出到班级平均成绩文件中?出到班级平均成绩文件中?班级编号班级编号学号学号英语成绩英语成绩20040100190.520040100267.520040100378.020040200167.020040200279.020040300182.520040300266.0程序处理过程(程序处理过程(PDL代码)代码):读入学生成绩文件的第一个记录;读入学生成绩文件的第一个记录;beforeKey=这个纪录的班级编号;这个纪录的班级编号;sum=这个纪录的成绩这个纪录的成绩;n=1;While(学生成绩文件没有结束)学生成绩文件没有结束)读入下一个学生成绩记录;读入下一个学生成绩记录;afterKey=这个纪录的班级编号;这个纪录的班级编号;if(afterKey=beforeKey)sum+=这个纪录的成绩;这个纪录的成绩;n+;else输出输出sum/n到班级平均成绩文件;到班级平均成绩文件;beforeKey=afterkey;sum=这个纪录的成绩;这个纪录的成绩;n=1;输出输出sum/n到班级平均文件;到班级平均文件;输入文件输入文件BREAK处理处理输出文件输出文件Break方法处理概要方法处理概要vBREAK方法的前提条件方法的前提条件:在进行在进行BREAK处理之前,输入文件必须是已处理之前,输入文件必须是已经按照关键字项目值进行排序(升序或者降经按照关键字项目值进行排序(升序或者降序)处理好的。序)处理好的。3.2.2结构化编码结构化编码BREAK方法的处理流程说明方法的处理流程说明:按关键字项目值的升序读入输入文件的记录,把关按关键字项目值的升序读入输入文件的记录,把关键字项目的值存入工作变量中。键字项目的值存入工作变量中。关键字项目的值相同时,进行统计处理(或者其他关键字项目的值相同时,进行统计处理(或者其他处理)。处理)。关键字项目的值发生了变化(关键字项目的值发生了变化(BREAK)的时候,)的时候,把变化前(把变化前(BREAKBEFOR)的关键字项目值和统)的关键字项目值和统计结果输出到文件中(或者其他处理),用变化后计结果输出到文件中(或者其他处理),用变化后(BREAKAFTER)的关键字项目值替换变化前的)的关键字项目值替换变化前的关键字项目值。关键字项目值。3.2.2结构化编码结构化编码读入输入文件的下一条记录,把关键字项读入输入文件的下一条记录,把关键字项目的值存入变化后的工作变量中。目的值存入变化后的工作变量中。继续进行上述继续进行上述至至的处理,直至文件读的处理,直至文件读入结束。入结束。BREAK处理流程处理流程汇总处汇总处理理学号学号姓名姓名语语文文数学数学总总分分 001 001吴吴晓晓燕燕9080170170002002张张光光华华7880158004004李锋李锋6577142142学号学号姓名姓名001吴吴晓晓燕燕002002张张光光华华003003田野田野004004李锋李锋学号学号语文语文数学数学001908000278800046777学生名称文件学生名称文件学生成绩文件学生成绩文件学生成绩汇总文件学生成绩汇总文件MACHING方法的引入方法的引入:问题:读入学生名称文件和学生成绩文件,把相同编号的数据问题:读入学生名称文件和学生成绩文件,把相同编号的数据记录结合起来,输出到学生成绩汇总文件中记录结合起来,输出到学生成绩汇总文件中?程序处理过程(程序处理过程(PDL代码)代码):读入学生名称文件的第一个记录;读入学生名称文件的第一个记录;bKey=这个纪录的学号;这个纪录的学号;读入学生成绩文件的第一个记录;读入学生成绩文件的第一个记录;tKey=这个纪录的学号;这个纪录的学号;While(学生成绩文件没有结束)学生成绩文件没有结束)if(bKey=tKey)输出输出bKey记录的学号、姓名和记录的学号、姓名和tKey记录的单科成绩和总成绩记录的单科成绩和总成绩到学生到学生成绩成绩汇总文件中;汇总文件中;读入下一个学生成绩记录;读入下一个学生成绩记录;tKey=这个纪录的学号;这个纪录的学号;elseif(bKeytKey)读入下一个读入下一个学生名称记录;学生名称记录;bKey=这个纪录的学号;这个纪录的学号;else输出错误信息输出错误信息(学号为学号为tKey的学生记录在学生名称文件中没有的学生记录在学生名称文件中没有);读入下一个学生成绩记录;读入下一个学生成绩记录;tKey=这个纪录的学号;这个纪录的学号;基础数据文件基础数据文件事务数据文件事务数据文件MATCHING处理处理输出文件输出文件错误信息文件错误信息文件MACHING方法处理概要方法处理概要3.2.2结构化编码结构化编码vMATCHING方法的前提条件方法的前提条件:在进行在进行MATCHING处理之前,输入文件必须处理之前,输入文件必须是已经按照关键字项目的值进行排序(升序是已经按照关键字项目的值进行排序(升序或者降序)处理好的。或者降序)处理好的。3.2.2结构化编码结构化编码vMATCHING方法处理流程说明方法处理流程说明:按关键字项目值的升序读入基础文件的记录,把关按关键字项目值的升序读入基础文件的记录,把关键字项目的值存入基础键字项目的值存入基础KEY工作变量中。工作变量中。按关键字项目值的升序读入事务文件的记录,把关按关键字项目值的升序读入事务文件的记录,把关键字项目的值存入事务键字项目的值存入事务KEY工作变量中。工作变量中。基础基础KEY的值与事务的值与事务KEY值相等时,把事务文件的值相等时,把事务文件的数据编辑输出到文件中。读入事务文件的下一条记数据编辑输出到文件中。读入事务文件的下一条记录,把关键字值存入事务录,把关键字值存入事务KEY。3.2.2结构化编码结构化编码基础基础KEY的值大于事务的值大于事务KEY值的时候,把事务值的时候,把事务KEY的值写到错误信息文件中。读入事务文件的下一条的值写到错误信息文件中。读入事务文件的下一条记录,把关键字值存入事务记录,把关键字值存入事务KEY。基础基础KEY的值小于事务的值小于事务KEY值的时候,读入基础文值的时候,读入基础文件的下一条记录,把关键字值存入基础件的下一条记录,把关键字值存入基础KEY。继续进行上述继续进行上述至至的处理,直至文件读入结束。的处理,直至文件读入结束。MACHING处理流程处理流程3.3 编码规范v代码组织与风格代码组织与风格v注释注释v命名命名v声明声明v语句结构语句结构3.3.1代码组织与风格代码组织与风格1基本原则基本原则v代码的组织和风格的基本原则是:便于自代码的组织和风格的基本原则是:便于自己的开发,己的开发,易于与他人的交流易于与他人的交流。v因个人习惯和编辑器等可以设置和形成自因个人习惯和编辑器等可以设置和形成自己的风格,但必须前后一致,并符合本规己的风格,但必须前后一致,并符合本规范的基本要求和原则。范的基本要求和原则。3.3.1代码组织与风格代码组织与风格2缩进缩进v子功能块当在其父功能块后缩进。子功能块当在其父功能块后缩进。v当功能块过多而导致缩进过深时将子功能块提取出来做为当功能块过多而导致缩进过深时将子功能块提取出来做为子函数。子函数。v代码中以代码中以TAB(4个字符)缩进,在编辑器中请将个字符)缩进,在编辑器中请将TAB设设置为以空格替代,否则在不同编辑器或设置下会导致置为以空格替代,否则在不同编辑器或设置下会导致TAB长长度不等而影响整个程序代码的格式。例如:度不等而影响整个程序代码的格式。例如:缩进示例:缩进示例:publicvoidmethodName()if(somecondition)for()/somesentences/endfor/endif3.3.1代码组织与风格代码组织与风格3长度长度 v为便于阅读和理解,单个函数的有效代码长度当为便于阅读和理解,单个函数的有效代码长度当尽量控制在尽量控制在100行以内(不包括注释行),当一行以内(不包括注释行),当一个功能模块过大时往往造成阅读困难,因此当使个功能模块过大时往往造成阅读困难,因此当使用子函数等将相应功能抽取出来,这也有利于提用子函数等将相应功能抽取出来,这也有利于提高代码的重用度。高代码的重用度。v单个类也不宜过大,当出现此类情况时当将相应单个类也不宜过大,当出现此类情况时当将相应功能的代码重构到其他类中,通过组合等方式来功能的代码重构到其他类中,通过组合等方式来调用,建议单个类的长度包括注释行不超过调用,建议单个类的长度包括注释行不超过1500行。行。v尽量避免使用大类和长方法。尽量避免使用大类和长方法。3.3.1代码组织与风格代码组织与风格4行宽行宽 页宽应该设置为页宽应该设置为80字符。一般不要超过这个字符。一般不要超过这个宽度宽度,这会导致在某些机器中无法以一屏来这会导致在某些机器中无法以一屏来完整显示完整显示,但这一设置也可以灵活调整。在但这一设置也可以灵活调整。在任何情况下任何情况下,超长的语句应该在一个逗号后超长的语句应该在一个逗号后或一个操作符前折行。一条语句折行后或一个操作符前折行。一条语句折行后,应应该比原来的语句再缩进一个该比原来的语句再缩进一个TAB或或4个空格,个空格,以便于阅读。以便于阅读。3.3.1代码组织与风格代码组织与风格5间隔间隔 v 类、方法及功能块间等应以空行相隔,以类、方法及功能块间等应以空行相隔,以增加可读性,但不得有无规则的大片空行。增加可读性,但不得有无规则的大片空行。v操作符两端应当各空一个字符以增加可操作符两端应当各空一个字符以增加可读性。读性。v相应独立的功能模块之间可使用注释行相应独立的功能模块之间可使用注释行间隔,并标明相应内容间隔,并标明相应内容 3.3.1代码组织与风格代码组织与风格6对齐对齐 v关系密切的行应对齐,对齐包括类型、修饰、名关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。称、参数等各部分对齐。v连续赋值时当对齐操作符。连续赋值时当对齐操作符。v当方法参数过多时当在每个参数后(逗号后)换当方法参数过多时当在每个参数后(逗号后)换行并对齐。行并对齐。v当控制或循环中的条件比较长时当换行(操作符当控制或循环中的条件比较长时当换行(操作符前)、对齐并注释各条件。前)、对齐并注释各条件。v变量定义最好通过添加空格形成对齐,同一类型变量定义最好通过添加空格形成对齐,同一类型的变量应放在一起的变量应放在一起 例/*变量对齐变量对齐-*/代码对齐和间隔示例代码对齐和间隔示例intcount=100;intlength=0;StringstrUserName=null;IntegerporductCode=newInteger(2);/产品编码数组产品编码数组/*参数对齐参数对齐-*/publicConnectiongetConnection(Stringurl,StringuserName,Stringpassword)throwsSQLException,IOException/*换行对齐换行对齐-*/publicfinalstaticStringSQL_SELECT_PRODUCT=“SELECT*“+“FROMTProductWHEREProd_ID=”+prodID;/*条件对齐条件对齐-*/if(Condition1/当条件一当条件一&Condition2/并且条件二并且条件二|Condition3)/或者条件三或者条件三/*相应独立的功能模块之间可使用注释行间隔,并标明相应内容相应独立的功能模块之间可使用注释行间隔,并标明相应内容*/for(inti=0;iproductCount.length;/循环终止条件循环终止条件i+)3.3.1代码组织与风格代码组织与风格7括号括号 中的语句应该单独作为一行,左括号中的语句应该单独作为一行,左括号当紧跟当紧跟其语句后,右括号其语句后,右括号永远单独作为一行且与其匹永远单独作为一行且与其匹配行对齐,并尽量在其后说明其匹配的功能模块。配行对齐,并尽量在其后说明其匹配的功能模块。较长的方法以及类、接口等的右括号后应使用较长的方法以及类、接口等的右括号后应使用/end.等标识其结束。如等标识其结束。如:类的结束符:类的结束符:/EOCClassName,方法结束符:方法结束符:/endmethodName(),功能块结束:功能块结束:/endif.userNameisnull?循环快结束:循环快结束:/endfor.everyuserinuserList左括号是否换行等随个人习惯而定,若换行则当左括号是否换行等随个人习惯而定,若换行则当与其前导语句首字符对齐。与其前导语句首字符对齐。vv注释分为序言性注释和功能性注释注释分为序言性注释和功能性注释vv功能性注释嵌在源程序体中,用以描述其后功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,或是执行的语句或程序段是在做什么工作,或是执行了下面的语句会怎么样。而不要解释下面怎了下面的语句会怎么样。而不要解释下面怎么做。么做。vv例如,例如,/*ADD AMOUNT TO TOTAL*/TOTAL=AMOUNTTOTAL不好。不好。注释注释vv如果注明把月销售额计入年度总额,便使如果注明把月销售额计入年度总额,便使读者理解了下面语句的意图:读者理解了下面语句的意图:/*ADD MONTHLY-SALES TO ANNUAL-TOTAL*/TOTAL=AMOUNTTOTAL注释注释1基本原则基本原则 (1)注释应该增加代码的清晰度。代码注释的目的注释应该增加代码的清晰度。代码注释的目的是要使代码更易于被其他开发人员等理解。是要使代码更易于被其他开发人员等理解。(2)如果你的程序不值得注释,那么它很可能也不如果你的程序不值得注释,那么它很可能也不值得运行。值得运行。(3)避免使用装饰性内容。避免使用装饰性内容。(4)保持注释的简洁。保持注释的简洁。(5)注释信息不仅要包括代码的功能,还应给出原注释信息不仅要包括代码的功能,还应给出原因。因。(6)不要为注释而注释。不要为注释而注释。(7)除变量定义等较短语句的注释可用行尾注释外,除变量定义等较短语句的注释可用行尾注释外,其他注释当避免使用行尾注释。其他注释当避免使用行尾注释。注释注释2文件注释文件注释 在每个文件的头部都应该包含该文件的功能、在每个文件的头部都应该包含该文件的功能、作用、作者、版权以及创建、修改记录等。作用、作者、版权以及创建、修改记录等。/*=*FileName:helloworld.java *Created:2006-9-6 20:18:53 by 彭彭辉辉*=*Copyright:Copyright(c)成都信息工程学院成都信息工程学院,2005-2006*=*Description:在在这这儿儿对对整个文件整个文件进进行描述行描述*=*Modification Hisytory:*1.2006-9-6,彭彭辉创辉创建了此文件建了此文件*2.对这对这个文件的修改个文件的修改历历史史进进行行详细详细描述,一般包括描述,一般包括时间时间,修改者,修改者,*修改的内容描述,修改的原因修改的内容描述,修改的原因*/注释注释3类、接口注释类、接口注释在类、接口定义之前当对其进行注释,包括在类、接口定义之前当对其进行注释,包括类、接口的目的、作用、功能、继承于何种类、接口的目的、作用、功能、继承于何种父类,实现的接口、实现的算法、使用方法、父类,实现的接口、实现的算法、使用方法、示例程序等。示例程序等。/*类名类名:StringUtil 功能功能:定义字符串操作时所需要用到的方法,如:定义字符串操作时所需要用到的方法,如转换中文、转换中文、HTML标记处理等。标记处理等。作者作者:彭辉彭辉版本版本:1.0版版备注备注:*/publicclassStringUtil 注释注释4方法注释方法注释 v明确该方法功能、作用、各参数含义以及明确该方法功能、作用、各参数含义以及返回值等。复杂的算法用返回值等。复杂的算法用/*/在方法内注解在方法内注解出。出。v参数注释时当注明其取值范围等。参数注释时当注明其取值范围等。v返回值当注释出失败、错误、异常时的返返回值当注释出失败、错误、异常时的返回情况。回情况。v异常当注释出什么情况、什么时候、什么异常当注释出什么情况、什么时候、什么条件下会引发什么样的异常条件下会引发什么样的异常/*函数名函数名:executeQuery功能功能:该方法根据:该方法根据SQL语句,查询数据库,返回它的结果集语句,查询数据库,返回它的结果集参数参数:1、sqlin:标准的标准的SQL语句语句,不可以为空串,不可以为空串返回值返回值:ResultSet结果集,若查询失败则返回结果集,若查询失败则返回null异常异常:SQLException,当查询数据库时可能引发此异常,当查询数据库时可能引发此异常备注备注:*/publicResultSetexecuteQuery(Stringsql)throwsSQLException/Statement和和SQL语句都不能为空语句都不能为空if(null!=stmt&!StringUtil.isEmpty(sql)/返回查询执行结果返回查询执行结果returnstmt.executeQuery(sql);returnnull;/endexecuteQuery()注释注释5其他注释其他注释 v应对重要的变量加以注释,以说明其含义应对重要的变量加以注释,以说明其含义等。等。v应对不易理解的分支条件表达式加注释。应对不易理解的分支条件表达式加注释。不易理解的循环,应说明出口条件。过长的不易理解的循环,应说明出口条件。过长的方法实现,应将其语句按实现的功能分段加方法实现,应将其语句按实现的功能分段加以概括性说明。以概括性说明。v对于异常处理,当注明正常情况及异常情对于异常处理,当注明正常情况及异常情况的条件,并说明当异常发生时程序当如何况的条件,并说明当异常发生时程序当如何处理。处理。注释在源代码中的比例一般为注释在源代码中的比例一般为20%左右左右命名命名 1基本原则基本原则 规范的命名能使程序更易阅读,从而更易于理解。它们也可规范的命名能使程序更易阅读,从而更易于理解。它们也可以提供一些标识功能方面的信息,有助于更好的理解代码和以提供一些标识功能方面的信息,有助于更好的理解代码和应用。应用。v名字应能反映它所代表的实际东西,应有一定实际意义。名字应能反映它所代表的实际东西,应有一定实际意义。例如,表示次数的量用例如,表示次数的量用Times,表示总量的用,表示总量的用Total,表示,表示平均值的用平均值的用Average,表示和的量用,表示和的量用Sum等等v使用可以准确说明变量使用可以准确说明变量/字段字段/类类/接口接口/包等的完整的英文包等的完整的英文描述符。例如,采用类似描述符。例如,采用类似firstName,listAllUsers或或CorporateCustomer这样的名字,严禁使用汉语拼音及不这样的名字,严禁使用汉语拼音及不相关单词命名。相关单词命名。v采用该领域的术语。如果用户称他们的采用该领域的术语。如果用户称他们的“客户客户”(clients)为为“顾客顾客”(customers),那么就采用术语,那么就采用术语Customer来命名这个类,而不用来命名这个类,而不用Client。v采用大小写混合,提高名字的可读性。一般应该采用大小写混合,提高名字的可读性。一般应该采用小写字母,但是类和接口的名字的首字母,以采用小写字母,但是类和接口的名字的首字母,以及任何中间单词的首字母应该大写。及任何中间单词的首字母应该大写。v尽量少用缩写,但如果一定要使用,当使用公共尽量少用缩写,但如果一定要使用,当使用公共缩写和习惯缩写等,如实现(缩写和习惯缩写等,如实现(implement)可缩写)可缩写成成impl,经理(,经理(manager)可缩写成)可缩写成mgr等,严禁等,严禁滥用缩写。滥用缩写。v避免使用长名字(最好不超过避免使用长名字(最好不超过25个字母)。个字母)。v避免使用相似或者仅在大小写上有区别的名字。避免使用相似或者仅在大小写上有区别的名字。命名命名 2类、接口类、接口 所有单词首字母大写。使用能确切反应该类、所有单词首字母大写。使用能确切反应该类、接口含义、功能等的词。一般采用名词。接口含义、功能等的词。一般采用名词。例:例:classStringList3常量常量采用完整的英文大写单词,在词与词之间用采用完整的英文大写单词,在词与词之间用下划线连接,如:下划线连接,如:StaticfinalintDEFAULT_VALUE=10;命名命名 4变量和参数变量和参数 变量命名由(变量命名由(前缀前缀+修饰语修饰语)构成。现在比较流行的是一套)构成。现在比较流行的是一套由微软的一个匈牙利软件工程师首先使用,并且在微软推广由微软的一个匈牙利软件工程师首先使用,并且在微软推广开来,现在被称之为匈牙利命名法的命名规则。开来,现在被称之为匈牙利命名法的命名规则。匈牙利命名匈牙利命名法规定法规定,使用表示标识符所对应的变量类型的英文小写缩写,使用表示标识符所对应的变量类型的英文小写缩写作为标识符的前缀,后面在使用表示变量意义的英文单词或作为标识符的前缀,后面在使用表示变量意义的英文单词或缩写进行命名。下面是匈牙利命名法中的一些命名前缀:缩写进行命名。下面是匈牙利命名法中的一些命名前缀:(1)类型前缀:用)类型前缀:用s(String)表示字符串表示字符串,c(char)表示字符表示字符,n(number)数值数值,i(intger)表示整数表示整数,d(double)表示双精度表示双精度,f(float)浮点型浮点型,b(bool)布尔型布尔型,dt(date)表示日期型表示日期型.例如:例如:iLength表示整型的局域变量表示整型的局域变量,是用来标识长度的是用来标识长度的.sCode表示字符串型的局域变量表示字符串型的局域变量,用来标识代码。用来标识代码。bFlag,nCount;命名命名 5组件组件/部件部件v应采用完整的英文描述符命名组件(接口部件),遵循应采用完整的英文描述符命名组件(接口部件),遵循匈牙利命名法则匈牙利命名法则如:如:btnOK,lblName。v控件命名由(控件命名由(前缀前缀+修饰语修饰语)构成。前缀即为控件的名)构成。前缀即为控件的名称或缩写。称或缩写。控件种类控件种类前缀前缀例例命令按钮命令按钮btnbtnSave组合框组合框cmbcmbCondition文本框文本框txttxtUserName标签标签lbllblOpenDate列表框列表框lstlstSelectedItem检查框检查框chkchkKey命名命名 6方法方法方法的命名应采用完整的英文描述符,大小写混合方法的命名应采用完整的英文描述符,大小写混合使用:所有中间单词的第一个字母大写。方法名称使用:所有中间单词的第一个字母大写。方法名称的第一个单词常常采用一个有强烈动作色彩的动词。的第一个单词常常采用一个有强烈动作色彩的动词。取值类使用取值类使用get前缀,设值类使用前缀,设值类使用set前缀,判断类前缀,判断类使用使用is(has)前缀。前缀。例:例:getName()setSarry()isLogin()checkUser()3.3.4声明声明 1方法方法 良好的程序设计应该尽可能减小类与类之间耦合,所遵循的良好的程序设计应该尽可能减小类与类之间耦合,所遵循的经验法则是:经验法则是:尽量限制成员函数的可见性尽量限制成员函数的可见性。如果成员函数没。如果成员函数没必要公有必要公有(public),就定义为保护,就定义为保护(protected);没必要保;没必要保护护(protected),就定义为私有,就定义为私有(private)。声明顺序声明顺序:v构造方法构造方法v静态公共方法静态公共方法v静态私有方法静态私有方法v公共方法公共方法v受保护方法受保护方法v私有方法私有方法v继承自继承自Object的方法的方法 3.3.4声明声明 2字段(成员变量)字段(成员变量)v若没有足够理由,不要把实例变量或类变量声明若没有足够理由,不要把实例变量或类变量声明为公有。公共和保护的可见性应当尽量避免,所有为公有。公共和保护的可见性应当尽量避免,所有的字段都建议置为私有,由获取和设置成员函数的字段都建议置为私有,由获取和设置成员函数(Getter、Setter)访问。)访问。v不允许不允许“隐藏隐藏”字段,即给局部变量所取的名字,字段,即给局部变量所取的名字,不可与另一个更大范围内定义的字段的名字相同不可与另一个更大范围内定义的字段的名字相同(或相似)。例如,如果把一个字段叫做(或相似)。例如,如果把一个字段叫做firstName,就不要再生成一个局部变量叫做,就不要再生成一个局部变量叫做firstName,或者任何易混肴的名字,如,或者任何易混肴的名字,如fistName。v一行代码只声明一个变量,仅将一个变量用于一一行代码只声明一个变量,仅将一个变量用于一件事。件事。3.3.4声明声明 声明顺序声明顺序:v常量常量v类变量类变量v公有字段公有字段v受保护字段受保护字段v私有字段私有字段3.3.5 语句结构v在设计阶段确定了软件的逻辑流在设计阶段确定了软件的逻辑流结构,但构造单个语句则是编码结构,但构造单个语句则是编码阶段的任务。语句构造力求简单,阶段的任务。语句构造力求简单,直接,不能为了片面追求效率而直接,不能为了片面追求效率而使语句复杂化。使语句复杂化。1.程序编写首先应当考虑清晰性程序编写首先应当考虑清晰性v程序编写首先应当考虑清晰性,程序编写首先应当考虑清晰性,不要刻意追求技巧性,使程序编不要刻意追求技巧性,使程序编写得过于紧凑。写得过于紧凑。v例如,有一个用例如,有一个用 C 语句写出的程语句写出的程序段:序段:AI=AIAT;AT=AIAT;AI=AIAT;v此段程序可能不易看懂,有时还此段程序可能不易看懂,有时还需用实际数据试验一下。需用实际数据试验一下。v实际上,这段程序的功能就是交实际上,这段程序的功能就是交换换AI和和AT中的内容。目的是为中的内容。目的是为了节省一个工作单元。如果改一了节省一个工作单元。如果改一下:下:WORK=AT;AT=AI;AI=WORK;就能让读者一目了然了。就能让读者一目了然了。2.程程序序要要能能直直截截了了当当地地说说明明程程序序员员的的用用意意。v程序编写得要简单,写清楚,直程序编写得要简单,写清楚,直截了当地说明程序员的用意。例如,截了当地说明程序员的用意。例如,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 是一个单位矩是一个单位矩阵。阵。v写成以下的形式,就能让读者直写成以下的形式,就能让读者直接了解程序编写者的意图。接了解程序编写者的意图。for(i1;i=n;i+)for(j1;j=a a)if(if(charchar=0&char=9)不要让读者绕弯子想。不要让读者绕弯子想。12.不要修补不好的程序,要重新编写。也不要修补