编程规范V10.docx
- 文档编号:26612083
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:18
- 大小:25.79KB
编程规范V10.docx
《编程规范V10.docx》由会员分享,可在线阅读,更多相关《编程规范V10.docx(18页珍藏版)》请在冰豆网上搜索。
编程规范V10
1.目的1
2.文件样式1
3.程序版式4
4.命名规则8
5.表达式和基本语句9
6.其它编程技巧和建议11
JAVA编程规范V1.0
1.目的
由于项目开发主要采用JAVA编程语言,为了让所有的程序代码看起来像一个人写的,增强代码的可读性、规范性和正确性,所以定义了这个规范。
2.文件样式
【规则2-1】每个JAVA源文件开头都必须有版权说明信息。
主要内容有:
(1)版权信息。
(2)文件名称,标识符,摘要。
(3)当前版本号,作者/修改者,完成日期。
(4)版本历史信息。
格式如下:
/**
*Copyright(C)2004ShanghaiLeapCommCommunicationTechonlogiesInc.
*Allrightsreserved.
*
*Version:
1.0
*Author:
Jerry(输入作者名字)
*Date:
2001年7月20日
*
*Modify:
Jerry(输入修改者名字)
*Content:
在类User中增加了SelectUser()的方法
*Date:
2001年7月20日
*/
【规则2-2】Package/Imports的顺序安排
package行要在import行之前,import中标准的包名要在本地的包名之前,而且按照字母顺序排列。
如果import行中包含了同一个包中的不同子目录,则应该用*来处理。
package.stats;
importjava.io.*;
importjava.util.Observable;
importhotlava.util.Application;
这里java.io.*使用来代替InputStreamandOutputStream的。
【规则2-3】对每个类要有简单的说明,类中重要的方法要有相应的注释。
类中定义的成员变量如果名字含义明确的话,可以没有注释,静态变量或Final变量一定要加以注释说明。
/**
*Aclassrepresentingasetofpacketandbytecounters
*Itisobservabletoallowittobewatched,butonly
*reportschangeswhenthecurrentsetiscomplete
*/
publicclassCounterSetextendsObservableimplementsCloneable
{
publicstaticintMAX_PK_NUM=50;//最大的包数量
protectedint[]packets;
接下来是类变量的存取的方法。
它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。
/**
*@description:
Getthecounters
*@param:
none
*@return:
anarraycontainingthestatisticaldata.
*/
publicint[]getPackets(){returncopyArray(packets,offset);}
/**
*@description:
Setthecounters
*@param:
int[]packetscountersarray
*@return:
none
*/
publicbooleansetPackets(int[]packets){this.packets=packets;}
其它的方法不要写在一行上
接下来是构造函数,它应该用递增的方式写(比如:
参数多的写在后面)。
publicCounterSet()
{}
publicCounterSet(intsize)
{
this.size=size;
}
}
【建议2-4】无论如何,每一个类都应该定义toString方法。
publicStringtoString()
{
Stringretval="CounterSet:
";
for(inti=0;i { retval+=data.bytes.toString(); retval+=data.packets.toString(); } returnretval; } 【建议2-5】为了常规用途而创建一个类时,请采取“经典形式”,并包含对下述元素的定义: equals() hashCode() toString() clone()(implementCloneable)implementSerializable 【建议2-6】对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。 为使用一个项目中的类,我们没必要删除测试代码。 若进行了任何形式的改动,可方便地返回测试。 这些代码也可作为如何使用类的一个示例使用。 如果main(String[])方法已经定义了,那么它应该写在类的底部.。 3.程序版式 【规则3-1】空行起着分隔程序段落的作用。 空行得体(不过多也不过少)将使程序的布局更加清晰。 空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。 所以不要舍不得用空行。 ●在每个类声明之后、每个方法定义结束之后都要加空行。 见示例3-1(a) ●在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。 见示例3-1(b) 举例如下: publicclassClass1 { //空行 publicintFunction1(…) { … } //空行 privatevoidFunction2(…) { … } //空行 privatebooleanFunction3(…) { … } } //空行 while(condition) { statement1; //空行 if(condition) { statement2; } else { statement3; } //空行 statement4; } 示例3-1(a)类、方法间的空行示例3-1(b)方法内部的空行 【规则3-2】书定风格良好的代码行。 ●一行代码只做一件事情,如只定义一个变量,或只写一条语句。 这样的代码容易阅读,并且方便于写注释。 ●if、for、while、do等语句自占一行,执行语句不得紧跟其后。 不论执行语句有多少都要加{}。 这样可以防止书写失误。 intwidth;//宽度 intheight;//高度 intdepth;//深度 intwidth,height,depth;//宽度高度深度 x=a+b; y=c+d; z=e+f; X=a+b;y=c+d;z=e+f; if(width { dosomething(); } if(width for(initialization;condition;update) { dosomething(); } //空行 other(); for(initialization;condition;update) dosomething(); other(); 示例3-2(a)风格良好的代码行示例3-2(b)风格不良的代码行 ●关键字之后要留空格。 象public、static、const、int等关键字之后至少要留一个空格,否则无法辨析关键字。 象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。 ●方法名之后不要留空格,紧跟左括号‘(’,以与关键字区别。 ●‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。 ●‘,’之后要留空格,如Function(x,y,z)。 如果‘;’不是一行的结束符号,其后要留空格,如for(initialization;condition;update)。 ●赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。 ●一元操作符如“! ”、“~”、“++”、“--”等前后不加空格。 ●象“[]”、“.”这类操作符前后不加空格。 ●对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for(i=0;i<10;i++)和if((a<=b)&&(c<=d)) publicvoidFunc1(intx,inty,intz);//良好的风格 publicvoidFunc1(intx,inty,intz);//不良的风格 if(year>=2000)//良好的风格 if(year>=2000)//不良的风格 if((a>=b)&&(c<=d))//良好的风格 if(a>=b&&c<=d)//不良的风格 for(i=0;i<10;i++)//良好的风格 for(i=0;i<10;i++)//不良的风格 for(i=0;I<10;i++)//过多的空格 x=a a: b;//良好的风格 x=a a: b;//不好的风格 array[5]=0;//不要写成array[5]=0; a.Function();//不要写成a.Function(); 【建议3-3】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。 {}之内的代码块在‘{’右边数格处左对齐。 publicvoidFunction(intx) { …//programcode } publicvoidFunction(intx){ …//programcode } if(condition) { …//programcode } else { …//programcode } if(condition){ …//programcode } else{ …//programcode } for(initialization;condition;update) { …//programcode } for(initialization;condition;update){ …//programcode } While(condition) { …//programcode } while(condition){ …//programcode } 如果出现嵌套的{},则使用缩进对齐,如: { … { … } … } 示例3-3(a)风格良好的对齐示例3-3(b)风格不良的对齐 【规则3-4】代码行最大长度宜控制在70至80个字符以内。 代码行不要过长,否则眼睛看不过来,也不便于打印。 【规则3-5】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。 拆分出的新行要进行适当的缩进,使排版整齐,语句可读。 if((very_longer_variable1>=very_longer_variable12) &&(very_longer_variable3<=very_longer_variable14) &&(very_longer_variable5<=very_longer_variable16)) { dosomething(); } publicCMatrixCMultiplyMatrix(CMatrixleftMatrix, CMatrixrightMatrix); for(very_longer_initialization; very_longer_condition; very_longer_update) { dosomething(); } 【规则3-6】JAVA语言的注释符为“/**…*/”,行注释一般采用“//…”。 注释通常用于: (1)版本、版权声明; (2)类、接口说明; (3)重要的代码行或段落提示。 虽然注释有助于理解代码,但注意不可过多地使用注释。 ●注释是对代码的“提示”,而不是文档。 程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱。 注释的花样要少。 ●如果代码本来就是清楚的,则不必加注释。 否则多此一举,令人厌烦。 例如 ●i++;//i加1,多余的注释 ●边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。 不再有用的注释要删除。 ●注释应当准确、易懂,防止注释有二义性。 错误的注释不但无益反而有害。 ●尽量避免在注释中使用缩写,特别是不常用缩写。 ●注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。 ●当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。 /* *函数介绍: *输入参数: *输出参数: *返回值: */ publicvoidFunction(floatx,floaty,floatz) { … } if(…) { … while(…) { … }//endofwhile … }//endofif 4.命名规则 【规则4-1】项目开发过程,对包路径的命名规则: com.century-------根目录 【规则4-2】Package包的命名,应该都是由一个小写单词组成。 例如: com.century.wap 【规则4-3】Class类的名字必须由大写字母开头而其他字母都小写的单词组成,而Class类变量的名字必须用一个小写字母开头,后面的单词用大写字母开头。 例如: publicclassUser { … } UserbillingUser=newUser();//Class类变量 【规则4-4】StaticFinal变量的名字应该都大写,并且指出完整含义。 例如: publicstaticintMAX_USER_NUM=50; 【规则4-5】参数的命名必须和变量的命名规范一致。 要使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字: 例如: SetCounter(intsize) { this.size=size; } 【规则4-6】推荐数组采用以下的方式来命名: byte[]buffer; 而不是: bytebuffer[]; 【规则4-7】方法的命名: 除第一个字母小写外,和类,接口的命名规则一样。 ●对于取属性值和设置属性值的方法: 不管是否是Bean,都要遵循JavaBean命名规范: getXXX(),setXXX() ●转换对象类型返回不同类型的方法: 命名成toType,比如: toString(),toArray() ●返回与调用此方法的对象(WrapperClass)同值的原始类型的方法: 命名成typeValue()形式,比如intValue(),floatValue() 5.表达式和基本语句 【规则5-1】如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。 例如: word=(high<<8)|low if((a|b)&&(a&c)) 【规则5-2】如a=b=c=0这样的表达式称为复合表达式。 允许复合表达式存在的理由是: (1)书写简洁; (2)可以提高编译效率。 但要防止滥用复合表达式。 ●不要编写太复杂的复合表达式。 例如: i=a>=b&&c ●不要有多用途的复合表达式。 例如: d=(a=b+c)+r; 该表达式既求a值又求d值。 应该拆分为两个独立的语句: a=b+c; d=a+r; ●不要把程序中的复合表达式与“真正的数学表达式”混淆。 例如: if(a 并不表示 if((a 而是成了令人费解的 if((a 【规则5-3】与零值比较时,几点特别注意事项。 ●不可将布尔变量直接与true、false或者1、0进行比较。 根据布尔类型的语义,零值为“假”(记为false),任何非零值都是“真”(记为true)。 true的值究竟是什么并没有统一的标准。 假设布尔变量名字为flag,它与零值比较的标准if语句如下: if(flag)//表示flag为真 if(! flag)//表示flag为假 其它的用法都属于不良风格,例如: if(flag==true) if(flag==1) if(flag==false) if(flag==0) ●应当将整型变量用“==”或“! =”直接与0比较。 假设整型变量的名字为value,它与零值比较的标准if语句如下: if(value==0) if(value! =0) 不可模仿布尔变量的风格而写成 if(value)//会让人误解value是布尔变量 if(! value) ●不可将浮点变量用“==”或“! =”与任何数字比较。 千万要留意,无论是float还是double类型的变量,都有精度限制。 所以一定要避免将浮点变量用“==”或“! =”与数字比较,应该设法转化成“>=”或“<=”形式。 假设浮点变量的名字为x,应当将 if(x==0.0)//隐含错误的比较 转化为 if((x>=-EPSINON)&&(x<=EPSINON)) 其中EPSINON是允许的误差(即精度)。 【规则5-4】循环语句的效率问题: while、for ●在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。 例如示例5-4(b)的效率比示例5-4(a)的高。 for(row=0;row<100;row++) { for(col=0;col<5;col++) { sum=sum+a[row][col]; } } for(col=0;col<5;col++) { for(row=0;row<100;row++) { sum=sum+a[row][col]; } } 示例5-4(a)低效率: 长循环在最外层示例5-4(b)高效率: 长循环在最内层 ●如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。 示例5-4(c)的程序比示例5-4(d)多执行了N-1次逻辑判断。 并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。 如果N非常大,最好采用示例5-4(d)的写法,可以提高效率。 如果N非常小,两者效率差别并不明显,采用示例5-4(c)的写法比较好,因为程序更加简洁。 for(i=0;i { if(condition) DoSomething(); else DoOtherthing(); } if(condition) { for(i=0;i DoSomething(); } else { for(i=0;i DoOtherthing(); } 表5-4(c)效率低但程序简洁表5-4(d)效率高但程序不简洁 【规则5-5】switch语句中,每个case语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。 【规则5-6】switch语句中,不要忘记最后那个default分支。 即使程序真的不需要default处理,也应该保留语句default: break;这样做并非多此一举,而是为了防止别人误以为你忘了default处理。 6.其它编程技巧和建议 【规则6-1】应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。 理想情况下,方法应简明扼要。 若长度很大,可考虑通过某种方式将其分割成较短的几个方法。 这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。 【建议6-2】使类尽可能短小精悍,而且只解决一个特定的问题。 下面是对类设计的一些建议: ●一个复杂的开关语句: 考虑采用“多形”机制 ●数量众多的方法涉及到类型差别极大的操作: 考虑用几个类来分别实现 ●许多成员变量在特征上有很大的差别: 考虑使用几个类 【建议6-3】让一切东西都尽可能地“私有”——private。 可使库的某一部分“公共化”(一个方法、类或者一个字段等等),就永远不能把它拿出。 若强行拿出,就可能破坏其他人现有的代码,使他们不得不重新编写和设计。 若只公布自己必须公布的,就可放心大胆地改变其他任何东西。 在多线程环境中,隐私是特别重要的一个因素——只有private字段才能在非同步使用的情况下受到保护。 【建议6-4】任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作。 【规则6-5】避免使用“魔术数字”,这些数字很难与代码很好地配合。 应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。 这样可使程序更易理解以及更易维护。 【规则6-6】在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),请采用下述方法: 初始化对象;若成功,则立即进入一个含有finally从句的try块,开始清除工作。 特别是从ConnectionPool取得一个数据库连接后,使用完后,应在finally从句中进行关闭处理,将数据库连接返还Pool。 【规则6-7】若在初始化过程中需要覆盖(取消)finalize(),请记住调用super.finalize()(若Object属于我们的直接超类,则无此必要)。 在对finalize()进行覆盖的过程中,对super.finalize()的调用应属于最后一个行动,而不应是第一个行动,这样可确保在需要基础类组件的时候它们依然有效。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 规范 V10