JAVA编程规范Word格式.docx
《JAVA编程规范Word格式.docx》由会员分享,可在线阅读,更多相关《JAVA编程规范Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
4代码文件风格13
4.1文件生成13
4.2程序注释13
4.3配置文件注释15
4.4get\set方法15
4.5构造函数16
4.6类方法17
5表达式和语句18
1概述
为确保系统源程序可读性,从而增强系统可维护性,兹制定下述编程规范,以规范系统各部分编程。
系统继承的其它资源中的源程序也应按此规范作相应修改。
1.1规范制定原则
(1)方便代码的交流和维护。
(2)不影响编码的效率,不与大众习惯冲突。
(3)使代码更美观、阅读更方便。
(4)使代码的逻辑更清晰、更易于理解。
1.2公共约定
(1)除需进行特定的编码集处理,其他使用UTF-8编码集。
(2)命名指系统中对源文件名、方法、目录、包、数据库表名、数据库字段等的命名。
(3)系统所用的命名都使用英文缩写来表达。
(4)命名的组成方式为:
前缀+{命名词素缩写},前缀表达出命名的用途,如数据库表等。
(5)命名的前缀由项目组确定。
(6)除系统公共维护对象外的其他对象,命名全部用小写。
一种方式用“_”作连接符,另一种方式是词素的第一个字母大写直接连接在一起。
在本规范中,数据库名、数据库字段名采用第一种方式,其余采用第二种方式。
(7)使用可以准确说明变量/字段/类/接口/包等的完整的英文描述符。
例如,采用类似firstName,listAllUsers或CorporateCustomer这样的名字,严禁使用汉语拼音及不相关单词命名,虽然JAVA支持Unicode命名,但本规范规定对包、类、接口、方法、变量、字段等不得使用汉字等进行命名。
(8)采用大小写混合,提高名字的可读性。
一般应该采用小写字母,但是类和接口的名字的首字母,以及任何中间单词的首字母应该大写,包名全部小写。
(9)尽量少用缩写,但如果一定要使用,当使用公共缩写和习惯缩写等,如实现(implement)可缩写成impl,经理(manager)可缩写成mgr等,具体参看下表,严禁滥用缩写。
(10)避免使用长名字(最好不超过25个字母)。
(11)避免使用数字,但可用2代替to,用4代替for等。
如:
go2Jsp。
2命名规范
标示符类型
命名约定
例子
包
全部小写。
标识符用点号分隔开来。
为了使包的名字更易读,Sun公司建议包名中的标识符用点号来分隔。
Sun公司的标准JAVA分配包用标识符.java开头。
全局包的名字用你的机构的Internet保留域名开头。
局部包:
interface.screens
全局包:
com.rational.www.interface.screens
类,接口
类的名字应该使用名词。
每个单词第一个字母应该大写。
避免使用单词的缩写,除非它的缩写已经广为人知,如HTTP。
ClassHello;
ClassHelloWorld;
InterfaceApple;
方法
第一个单词一般是动词。
第一个字母是小些,但是中间单词的第一个字母是大写。
如果方法返回一个成员变量的值,方法名一般为get+成员变量名,如若返回的值是bool变量,一般以is(has)作为前缀。
如果方法修改一个成员变量的值,方法名一般为:
set+成员变量名。
getName();
setName();
isFirst();
变量
第一个字母小写,中间单词的第一个字母大写。
不要用_或&
作为第一个字母。
尽量使用短而且具有意义的单词。
单字符的变量名一般只用于生命期非常短暂的变量。
i,j,k,m,n一般用于integers;
c,d,e一般用于characters。
如果变量是集合,则变量名应用复数。
命名组件采用骆驼命名法,所有前缀均应遵循同一个组件名称缩写列表。
StringmyName;
int[]students;
inti;
intn;
charc;
saveBtn(Btn是Button的缩写)
常量
所有常量名均全部大写,单词间以“_”隔开。
intMAX_NUM;
2.1文件、包命名规范
(1)文件名当与其类严格相同,所有单词首字母大写。
(2)包名一般以项目或模块名命名,少用缩写和长名,一律小写。
(3)基本包:
com,所有包、文件都从属于此包。
(4)包名按如下规则组成:
[基本包].[公司名].[项目名].[模块名].[子模块名]...
com.e-eye.emiv
com.e-eye.emiv.until…
(5)不得将类直接定义在基本包下,所有项目中的类、接口等都当定义在各自的项目和模块包中。
2.2类、接口命名规范
所有单词首字母大写。
使用能确切反应该类、接口含义、功能等的词,一般采用名词。
如使用MVC模式:
(1)Servlet类命名
一般对应于所服务的对象加后缀Service来命名,如:
UserService,TradeService等。
实现类一般对应于所服务的对象加后缀Impl来命名,如UserServiceImpl,TradeServiceImpl等。
(2)JSP\html文件命名
采用完整的英文描述说明JSP所完成的功能,尽可能包括一个生动的动词,第一个字母小写,如:
viewMessage.jsp、editUser.jsp或者forumChooser.html等。
(3)DAO类命名
UserDao,TradeDao等。
实现类一般对应于所服务的对象加后缀Impl来命名,如UserDaoImpl,TradeDaoImpl等。
(4)Controller类命名
一般对应于所服务的对象加后缀Controller来命名,如:
UserController等。
2.3方法命名规范
方法的命名应采用完整的英文描述符,大小写混合使用。
所有中间单词的第一个字母大写。
方法名称的第一个单词常常采用一个有强烈动作色彩的动词。
取值使用get前缀、设值使用set前缀、查询使用query(find)前缀、修改使用upd(update)前缀、删除使用del前缀、判断类使用is(has)前缀。
例:
getName();
setSarry();
isLogon();
queryUser();
updUserById();
方法参数建议顺序:
(被操作者,操作内容,操作标志,其他⋯)。
publicvoidreplace(StringsourceStr,StringoldStr,StringnewStr)
{
........
}
2.4常量、变量、参数命名规则
采用Camel命名法(骆驼命名法),词素规则见“公共约定”。
常量采用完整的英文大写单词,在词与词之间用下划线连接,如:
DEFAULT_VALUE。
临时变量通常被取名为i、j、k,m和n,它们一般用于整型;
c、d、e它们一般用于字符型。
2.5数据库命名规范
(1)表命名
前缀与命名词素间用下划线分隔。
命名由小写字母组成。
命名词素如果由单一词组成,可用全拼;
如果是多词组成,用缩写。
缩写间用下划线。
库表:
以“t_”开头;
视图:
以“v_”开头;
库表索引:
以“t_”开头,以“_idx”结尾;
库表唯一索引:
以“t_”开头,以“_uidx”结尾。
(2)表字段命名
如果是多词组成,用缩写;
没有前缀。
2.6其他
命名时应使用复数来表示它们代表多值。
orderItems
(1)集合
一个集合,例如数组和矢量,应采用复数命名来表示队列中存放的对象类型。
命名应采用完整的英文描述符,名字中所有非开头的单词的第一个字母应大写,适当使用集合缩写前缀。
VectorvProducts=newVector();
//产品向量
ArrayaryUsers=newArray();
//用户列表
(2)数组
数组应该总是用下面的方式来命名:
byte[]buffer;
而不是
bytebuffer[];
(3)神秘的数
程序里经常会用到一些量,它是有特定的含义的,把神秘的数定义为一个常量。
注意这个常量的命名应该能表达该数的意义,并且应该全部大写,以与对应于变量的标识符区别开来。
例如50这个数,可以定义为一个名为NUM_OF_EMPLOYEES的常量来代替。
3书写格式
严格要求书写格式是为了使程序整齐美观、易于阅读、风格统一,程序员对规范书写的必要性要有明确认识。
建议源程序使用eclipse\myEclipse工具开发,格式规范使用工具中自带格式化效果(Ctrl+Shift+f)。
3.1缩进
缩进建议以4个空格为单位。
预处理语句、全局数据、标题、附加说明、函数说明、标号等均顶格书写。
语句块的“{”和“}”配对对齐,并与其前一行对齐,语句块类的语句缩进建议每个“{”和“}”单独占一行,便于匹对。
eclipse中的默认方式是开始的“{”不是单独一行,建议更改成上述格式。
在if语句后缩进;
在else语句后缩进;
在switch语句后缩进;
在case语句后缩进;
在do句后缩进;
已经用行接续符分割的语句的各个行要缩进;
对从属于行标注的代码进行缩进。
3.2空格
原则上变量、类、常量数据和函数在其类型,修饰名称之间适当空格并据情况对齐。
关键字原则上空一格,如:
if(...)等。
运算符的空格规定如下:
“:
:
”、“->
”、“[”、“]”、“++”、“--”、“~”、“!
”、“+”、“-”(指正负号)、“&
”(引用)等几个运算符两边不加空格(其中单目运算符系指与操作数相连的一边),其它运算符(包括)大多数二目运算符和三目运算符“?
”和“:
”两边均加一空格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。
“,”运算符只在其后空一格,需对齐时也可不空或多空格。
不论是否有括号,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。
个人认为此项可以依照个人习惯决定遵循与否。
3.3对齐
原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。
另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在“,”处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。
变量定义最好通过添加空格或TAB键形成对齐,同一类型的变量最好放在一起。
如下例所示:
intnValue;
intnResult;
intnLength;
3.4空行
不得存在无规则的空行,比如说连续十个空行。
程序文件结构各部分之间空一行,由于每个函数还要有函数说明注释,故通常只需空一行或不空,但对于没有函数说明的情况至少应再空一行。
对自己写的函数,建议也加上“//------”做分隔。
函数内部数据与代码之间应空至少一行,代码中适当处应以空行空开,建议在代码中出现变量声明时,在其前空一行。
类中四个“p”之间至少空一行,在其中的数据与函数之间也应空行。
3.5注释
注释是软件可读性的具体体现。
程序注释量一般占程序编码量的20%,软件工程要求不少于20%。
程序注释不能用抽象的语言,类似于“处理”、“循环”这样的计算机抽象语言,要精确表达出程序的处理说明。
避免每行程序都使用注释,可以在一段程序的前面加一段注释,具有明确的处理逻辑。
注释必不可少,但也不应过多,不要被动的为写注释而写注释。
以下是必要的注释:
(1)标题、附加说明。
(2)函数、类等的说明。
对几乎每个函数都应有适当的说明,通常加在函数实现之前,在没有函数实现部分的情况下则加在函数原型前,其内容主要是函数的功能、目的、算法等说明,参数说明、返回值说明等,必要时还要有一些如特别的软硬件要求等说明。
公用函数、公用类的声明必须由注解说明其使用方法和设计思路,当然选择恰当的命名格式能够帮助你把事情解释得更清楚。
(3)在代码不明晰或不可移植处必须有一定的说明。
(4)及少量的其它注释,如自定义变量的注释、代码书写时间等。
(5)注释一定出现在要注释的程序段前,不要在某段程序后书写对这段程序的注释,先看到注释对程序的理解会有一定帮助。
如果有可能,请在注释行与上面代码间加一空行。
(6)需要注释的部分:
项目
注释哪些部分
实参/参数
参数类型
参数用来做什么
任何约束或前提条件
示例
字段/属性
字段描述
注释所有使用的不变量
并行事件
可见性决策
类
类的目的
已知的问题
类的开发/维护历史
注释出采用的不变量
并行策略
编译单元
每一个类/类内定义的接口,含简单的说明
文件名和/或标识信息
版权信息
接口
目的
它应如何被使用以及如何不被使用
局部变量
用处/目的
成员函数注释
成员函数做什么以及它为什么做这个
哪些参数必须传递给一个成员函数
成员函数返回什么
任何由某个成员函数抛出的异常
成员函数是如何改变对象的
包含任何修改代码的历史
如何在适当情况下调用成员函数的例子适用的前提条件和后置条件
成员函数内部注释
控制结构
代码做了些什么以及为什么这样做
难或复杂的代码
处理顺序
4代码文件风格
所有的JAVA(*.java)文件都必须遵守如下的样式规则。
4.1文件生成
对于规范的JAVA派生类,尽量用eclipse\myEclipse工具来生成文件格式,避免用手工制作的头文件/实现文件。
package/import
package行要在import行之前,import中标准的包名要在本地的包名之前,而且按照字母顺序排列。
如果import行中包含了同一个包中的不同子目录,尽量不使用“*”进行处理,减少程序引用的资源。
package.stats;
importjava.util.Observable;
importhotlava.util.Application;
4.2程序注释
文件头部注释主要是表明该文件的一些信息,是程序的总体说明,可以增强程序的可读性和可维护性。
文件头部注释一般位于package/imports语句之后,Class描述之前。
要求至少写出文件名、创建者、创建时间和内容描述。
其格式应该尽量约束如下:
(1)Class(类)
接下来的是类的注释,一般是用来解释类的。
/**
*本类做什么的,处理什么
*@author:
作者
*@version:
版本
*/
publicclassCounterSet{
..........
}
接下来是类定义,尽量包含在同行的extends和implements
publicclassCounterSetextendsObservableimplementsCloneable{
.....................
(2)ClassFields(类中成员)
接下来是类的成员变量:
*该变量做什么用,默认值是什么
protectedint[]packets;
接下来是类的方法:
*本方法做什么用,使用什么场景
*@param参数
*@throws什么时候抛出什么异常
protectedint[]getPackets(){
......
public的成员变量必须生成文档(JAVADoc)。
proceted、private和package定义的成员变量如果名字含义明确的话,可以没有注释。
(3)代码注释
对于逻辑复杂的代码片段,如多重for,多重if等必须要有注释标明。
单行注释:
//判断(处理)什么用的逻辑
If(){
多行注释:
*判断(处理)什么用的逻辑
4.3配置文件注释
配置文件注释对于配置文件中每一个(配置)节点进行解释。
用法:
<
!
--节点做什么用-->
aop:
aspectj-autoproxyproxy-target-class="
true"
/>
4.4get\set方法
类变量的存取的方法,它只是简单的用来将类的变量赋值获取值的话,简单的写在一行上。
publicint[]getPackets()
{
returncopyArray(packets,offset);
publicint[]getBytes()
returncopyArray(bytes,offset);
returnpackets;
publicvoidsetPackets(int[]packets)
this.packets=packets;
4.5构造函数
(1)构造函数,它应该用递增的方式写(比如:
参数多的写在后面)。
访问类型(public、private等)和任何(static、final、synchronized)应该在一行中,遵循JAVA编写习惯。
publicCounterSet(intsize)
this.size=size;
(2)克隆方法
如果这个类是可以被克隆的。
如下clone方法:
PublicObjectclone()
try
{
CounterSetobj=(CounterSet)super.clone();
obj.packets=(int[])packets.clone();
obj.size=size;
returnobj;
}
catch(CloneNotSupportedExceptione)
thrownewInternalError("
UnexpectedCloneNotSUpportedException:
"
+e.getMessage());
4.6类方法
方法必须明确,处理某一件(类)事情,逻辑处理复杂则进行按逻辑分隔为方法进行处理。
类的方法:
protectedfinalvoidsetArray(int[]r1,int[]r2,int[]r3,int[]r4)
throwsIllegalArgumentException
//
//Ensurethearraysareofequalsize
//
if(r1.length!
=r2.length||r1.length!
=r3.length||r1.length
=r4.length)
thrownewIllegalArgumentException("
Arraysmustbeofthesamesize"
;
System.arraycopy(r1,0,r3,0,r1.length);
System.arraycopy(r2,0,r4,0,r1.length);
(1)toString方法
建议每一个类都应该定义toString方法。
PublicStringtoString()
Stringretval="
CounterSet:
for(inti=0;
i<
data.length();
i++)
retval+=data.bytes.toString();
retval+=data.packets.toString();
}
returnretval;
(2)main方法
如果main(String[])方法已经定义了,那么它应该写在类的底部。
(3)System.out.println()使用
代码中尽量不使用该控制台输出,使用完后必须移除。
5表达式和语句
每行应该只有一条语句。
(1)if-else、if-elseif语句
任何情况下,都应该有“{”和“}”格式如下:
if(condition){
statements;
}elseif(condition){
}else{
(2)for语句格式
如下:
for(initialization;
condition;
update){
如果语句为空:
update);
(3)while语句格式
while(condition){
while(condition);
(4)do-while语句格式
do{
}while(condition);
(5)switch语句
每个switch里都应包含default子语句。
格式如下:
switch(condition){
caseABC:
/*fallsthrough*/
caseDEF:
break;