作程序员重要的是什么?有人问过你这样的问题吗?
知识,语言基础好?技术好?逻辑思维强?英语好?…………
也许作为一位优秀的程序员,每个人的身上都有这样那样的优点,但是既然有优点就会有缺点,而且别
人的一些优点或者天生的优势可能不是那么容易让更多的人去努力能够达到的。但是不管怎么样,做到
什么程度,程序员都必须要遵守一些规范,而且规范遵守和做的越好的程序员,不仅程序漂亮,其他方
便也会非常优秀。
我学习编程语言应该有八年时间了,从最初的C语言到最喜欢的Java,甚至汇编语言,PLC,因为经历了
学校到工作,从工作再到学校的几次转变,我深刻的体会到规范对于代码编写的重要性。
在学校的时候,学习编程语言可以说是完全的照本宣科,有的老师一整个学期都在念ppt,你很少或者根
本不会看到你的老师去调试和编写代码。更不要说实际操作代码是书写的时候,会出现这样的那样的问
题。因为有些问题不是说你完全按照书本上的就可以了。最简单的一个例子就是,书本上的版本和环境
往往跟不上实际工作状况,所以出现一些问题,书本的规范会让你越陷越深。
学校出来了,我参加了一份工作,当时我几乎是从头开始学习的,尤其是工作过程中的规范和参考标准
。当熬过几天几夜之后,你才会明白“实践是检验真理的唯一标准!“
在工作的时候我学习了PLC语言的编程,这是一种非常简单的语言,有过语言学习基础的人基本上可以很
轻松的拿下它。可是问题来了,由于这门语言完全是纯粹的IO语言,不同的IO生产厂商都有自己的标准
和方法。所以参照他们的标准和规范就非常有必要。一个IO输入输出可能就是机器的停止与前进,错误
的话后果很严重。这段时间我反复的听到一个词就是规范。
现在又开始Java语言的学习,现在就对比学校学到的语言,总结一些Java语言需要遵守的规范。有些不
是Java特别要求的语言规范,而是实际应用中更高效和提高代码生命力的习惯方法。
1
Package 的命名
Package 的名字应该都是由一个小写单词组成。Package的命名:Package 的名字应该都是由一个小
写单词成。
Class 的命名:Class 的名字必须由大写字母开头而其他字母都小写的单词组成
Static Final 变量的命名:Static Final 变量的名字应该都大写,并且指出完整含义。
参数的命名:参数的名字必须和变量的命名规范一致。
数组的命名:数组应该总是用下面的方式来命名: byte[] buffer; 而不是 byte buffer[];
方法的参数:使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:
SetCounter(int size){
this.size = size;
}
Class 的命名
Class 的名字必须由大写字母开头而其他字母都小写的单词组成
Class 变量的命名
变量的名字必须用一个小写字母开头。后面的单词用大写字母开头。
Static Final 变量的命名
Static Final 变量的名字应该都大写,并且指出完整含义。
2
参数的命名
参数的名字必须和变量的命名规范一致。
数组的命名
数组应该总是用下面的方式来命名:
byte[] buffer;
而不是:
byte buffer[];
方法的参数
使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:
SetCounter(int size){
this.size = size;
}
3
Java 文件样式
所有的 Java(*.java) 文件都必须遵守如下的样式规则
版权信息
版权信息必须在 java 文件的开头,比如:
/**
* Copyright ?0?3 2000 Shanghai XXX Co. Ltd.
* All right reserved.
*/
其他不需要出现在 javadoc 的信息也可以包含在这里。
4
Package/Imports
package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。
如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。
package hotlava.net.stats;
import java.io.*;
import java.util.Observable;
import hotlava.util.Application;
这里 java.io.* 使用来代替InputStream and OutputStream 的。
5
Class
接下来的是类的注释,一般是用来解释类的。
/**
* A class representing a set of packet and byte counters
* It is observable to allow it to be watched, but only
* reports changes when the current set is complete
*/
接下来是类定义,包含了在不同的行的 extends 和 implements
public class CounterSet
extends Observable
implements Cloneable
Class Fields
接下来是类的成员变量:
/**
* Packet counters
*/
protected int[] packets;
public 的成员变量必须生成文档(JavaDoc)。proceted、private和 package 定义的成员变量如果
名字含义明确的话,可以没有注释。
6
存取方法
接下来是类变量的存取的方法。它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一
行上。
/**
* Get the counters
* @return an array containing the statistical data. This array has been
* freshly allocated and can be modified by the caller.
*/
public int[] getPackets() { return copyArray(packets, offset); }
public int[] getBytes() { return copyArray(bytes, offset); }
public int[] getPackets() { return packets; }
public void setPackets(int[] packets) { this.packets = packets; }
其它的方法不要写在一行上
7
构造函数
接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。
访问类型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 应该在一行中
,并且方法和参数另写一行,这样可以使方法和参数更易读。
public
CounterSet(int size){
this.size = size;
}
克隆方法
如果这个类是可以被克隆的,那么下一步就是 clone 方法:
public
Object clone() {
try {
CounterSet obj = (CounterSet)super.clone();
obj.packets = (int[])packets.clone();
obj.size = size;
return obj;
}catch(CloneNotSupportedException e) {
throw new InternalError("Unexpected CloneNotSUpportedException: " + e.getMessage());
}
}
8
类方法
下面开始写类的方法:
/**
* Set the packet counters
* (such as when restoring from a database)
*/
protected final
void setArray(int[] r1, int[] r2, int[] r3, int[] r4)
throws IllegalArgumentException
{
// Ensure the arrays www.gzlij.com are of equal size
if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)
throw new IllegalArgumentException("Arrays must be of the same size");
System.arraycopy(r1, 0, r3, 0, r1.length);
System.arraycopy(r2, 0, r4, 0, r1.length);
}
9
toString 方法
无论如何,每一个类都应该定义 toString 方法:
public
String toString() {
String retval = "CounterSet: ";
for (int i = 0; i < data.length(); i++) {
retval += data.bytes.toString();
retval += data.packets.toString();
}
return retval;
}
}
main 方法
如果main(String[]) 方法已经定义了, 那么它应该写在类的底部.
1.1 一般要求
1、选择有意义的名字,能快速地传达该类的用途。
2、所有包的命名必须采用小写英文字母。
1.2 实际应用
应用系统中经常应用分层,Dao层(数据库访问)、Service层(业务处理)、Web层(页面控制action类
)。
1、包名的前几个为固定名称, 如果是网站的话,采用网站的域名的反写,如果域名还没有确定的话,采
用公司固定的几个名称。如:net.vschool
2、在包名的接下来一个单词为模块的名称。如:用户模块,包名为net.vschool.user
3、关于模块的访问操作,采用分层形式,一般分为:
Dao层操作:一般定义在net.vschool.xxx.dao 中,其中xxx为模块名称。
Service层操作:一般定义在net.vschool.xxx.servie中。
web层操作:一般定义在 net.vschool.xxx.action中。
如下关于用户模块的例子:
net.vschool.user
net.vschool.user.dao
net.vschool.user.action
net.vschool.user.service
二 类名的书写规范 (Class)
类名必须使用名词,如果一个类名内含多个单词,那么各个单词第一个字母大写,后续字母小写,起伏
呈驼峰状,人称驼峰式命名。给类名命名时,必须保证准确、简洁且容易理解。尽量使用完整单词,避
免使用缩写词(除了大家公认的)
2.1 类的命名
2.1.1 一般要求
1、选择有意义的名字,能快速地传达该类的用途。
2、参照java驼峰命名法,类名的首字母必须采用大写的形式,如果类名为多词组合而成的话,那么每个
词的首字母必须采用大写。如:StudentAnswer.java
3、当要区别接口类和实现类的时候,可以在类的后面加上“Impl”。
如:接口类:UserInterface.java 接口实现类:UserInterfaceImp
4、推荐实体类没有后缀名。
2.1.2 实际应用
应用系统中经常应用分层,Dao层(数据库访问)、Service层(业务处理)、Web层(页面控制action类
),每一层的类的名称尽量带上该层后缀。
1、Dao层
a、接口类:采用JavaBean+Interface+Dao的形式来定义,即,实体对象+Interface+Dao。
如:用户对象接口类: UserInterfaceDao,其中xxx为模块名称。
b、实现类:采用JavaBean+Interface+Impl+Dao的形式来定义,即,实体对象
+Interface+Impl+Dao。 如:用户对象实现类:UserInterfaceImplDao
2、Service层
a、接口类:采用Xxx+Interface+Service的形式来定义,即,模块+Interface+Service。
如:用户管理接口类:UserMsgInterfaceServiec
b、实现类:采用Xxx+Interface+Impl+Service的形式来定义,即,模块+Interface+
Impl+Service。如:用户管理实现类:UserMsgInterfaceImplServiec
3、Web层(action类)
a、实现类:采用县 Xxx+Operator+Action的形式来定义,即,模块+操作+Action。如
用户模块User+删除操作Delete+Action = UserDeleteAction
2.1 变量的命名
2.2.1 普通变量
2.2.2.1 一般要求
1、选择有意义的名字,能快速地传达该变量的用途。
2、参照java驼峰命名法,首字母以小写开头,每个单词首字母大写(第一个单词除外)。
2.2.2.2 实际应用
1、变量命名采用基本结构为typeVariableName,使用3字符前缀来表示数据类型。
例如,定义一个整形变量:intDocCount,其中int表明数据类型,后面为表意的英文名,每个单词首字
母大写。
数据类型或对象类型
变量前缀
备注
byte
bye
1、做数组用时,再加前缀-a,如字符串数组:astr,
2、自定义类型的变量可以采用本身的名称,把首字母改为小写。
3、采用名称要能代表在方法中的意义。如果员工列表:employeeList
char
chr
float
flt
boolean
bln
Integer/int
int
short
sht
Long/long
lng
Double/double
dbl
string
str
2、变量使用技巧:
a、在一段函数中不使用同一个变量表示前后意义不同的两个数值。
b、除非是在循环中,否则一般不推荐使用单个字母作为变量名,i、j、k等只作为小型循环的循环索引
变量。
c、避免用Flag来命名状态变量。
d、用Is来命名逻辑变量,如:blnFileIsFound。通过这种给布尔变量肯定形式的命名方式,使得其它开
发人员能够更为清楚的理解布尔变量所代表的意义。
e、如果需要对变量名进行缩写时,一定要注意整个代码中缩写规则的一致性。例如,如果在代码的某些
区域中使用intCnt,而在另一些区域中又使用intCount,就会给代码增加不必要的复杂性。建议变量名
中尽量不要出现缩写。
2.2.2 静态变量
1、选择有意义的名字,能快速地传达该变量的用途。
2、参照java驼峰命名法,采用全部大写的形式来书写,对于采用多词合成的变量采用“_”来连接各单
词。如:USER_LIST
2.3 方法的命名
2.3.1 一般要求
1、选择有意义的名字,能快速地传达该方法的用途。
2、参照java驼峰命名法,首字母以小写开头,每个单词首字母大写(第一个单词除外)。
2.3.2 实际应用
1、方法表示一种行为,它代表一种动作,最好是一个动词或者动词词组或者第一个单词为一个动词。
2、属性方法:以get/set开头,其后跟字段名称,字段名称首字母大写。如:getUserName()
3、数据层方法:只能以insert(插入),delete(删除),update(更新),select(查找),count(统
计)开头,其他层方法避免以这个5个单词开头,以免造成误解。
4、服务层方法,根据方法的行为命名,只描述方法的意义,而不采用方法的目的命名。比如系统的添加
新用户,用户可以前台注册,也可以管理员后台添加,方法会被重用,所以最好不要用使用register,
采用add会更好写。避免使用与web层相关的方法。
5、Web层方法最好是贴近web的语言,如register,login,logout等方法。
三 注释的书写规范 (Javadoc)
Java除了可以采用我们常见的注释方式(//、/* */)之外,Java语言规范还定义了一种特殊的注释,也
就是我们所说的Javadoc注释,以/**开头,而以*/结束, Javadoc 注释可以被自动转为在线文档,省去
了单独编写程序文档的麻烦。 推荐使用。
Javadoc注释主要涉及范围:类、属性、方法。
例如:
复制代码 代码如下:
package org.ietf.jgss;
import java.net.InetAddress;
import java.util.Arrays;
/**
* 该类的整体性描述。
*
* @author 作者
* @version 1.0, 05/22/07
* @since 1.0
*/
public class ChannelBinding {
/**
* 对该变量的备注信息
*/
private InetAddress initiator;
/**
* 对该变量的备注信息
*/
private InetAddress acceptor;
/**
* 对该变量的备注信息
*/
private byte[] appData;
/**
* 对该类的构造函数的备注信息。
*
* @param initAddr 对参数的备注。
* @param acceptAddr对参数的备注。
* @param appData对参数的备注。
*/
public ChannelBinding(InetAddress initAddr, InetAddress acceptAddr,
byte[] appData) {
initiator = initAddr;
acceptor = acceptAddr;
if (appData != null) {
this.appData = new byte[appData.length];
java.lang.System.arraycopy(appData, 0, this.appData, 0,
appData.length);
}
}
/**
* 对该类的具体一函数的备注信息
*
* @param obj 参数的备注信息
* @return 返回值的备注信息
*/
public boolean equals(Object obj) {
if (this == obj)
return true;
if (! (obj instanceof ChannelBinding))
return false;
ChannelBinding cb = (ChannelBinding) obj;
return Arrays.equals(appData, cb.appData);
}
}
四 其他书写规范
4.1 Jsp页面名称的书写规范
1.全部采用小写的英文字符和”_ ”组成。
2.整体采用模块名+操作的形式。如:user_view.jsp
3.Jsp页面尽可能与action的意思对应,如UserListAction 对应者user_list.jsp
接口:
使用驼峰式命名。除了用名词外,还可以用形容词命名(体现其功能特性)
方法:
规定用动词命名,适合用驼峰式命名,但与类名的最大区别在于,首字母必须小写
变量:
规定为名词,其他同“方法”命名方式一样。变量名非常关键,应含有具体意义且易于理解,一般不允
许使用单个字母做变量名。除非一些临时性变量,像在循环中使用到的计数器等。在使用单个字母做变
量名时,一般I、J、K用来命名整形变量。
常量:
规定全用大写字母表示,如果名字必须用多个单词来表示,那么各单词间用“-“分隔。常量要求必须意
义明确,能表达出常量的含义。