命名规范
1、一般概念
1、尽量使用完整的英文描述符
2、采用适用于相关领域的术语
3、采用大小写混合使名字可读
4、尽量少用缩写,但如果用了,必须符合整个工程中的统一定义
5、避免使用长的名字(小于 15 个字母为正常选择)
6、避免使用类似的名字,或者仅仅是大小写不同的名字
7、避免使用下划线(除静态常量等)
2、标识符类型说明
1、包( Package )的命名
Package 的名字应该采用完整的英文描述符,都是由一个小写单词组成。并且包名的前缀总是一个顶级域名,
通常是 com、edu、gov、mil、net、org 等;
如: com.yjhmily.test
2、类( Class )的命名
类名应该是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽量保证类名简洁而富于描述。
使用完整单词,避免缩写词 ( 除非工程内有统一缩写规范或该缩写词被更广泛使用,像 URL , HTML)
如: FileDescription
3、接口( Interface )的命名
基本与 Class 的命名规范类似。在满足 Classd 命名规则的基础之上,保证开头第一个字母为 ”I”,
便于与普通的 Class区别开。其实现类名称取接口名的第二个字母到最后,且满足类名的命名规范;
如: IMenuEngine
4、枚举( Enum )的命名
基本与 Class 的命名规范类似。在满足 Classd 命名规则的基础之上,保证开头第一个字母为 ”E” ,
便于与普通的 Class区别开。
如: EUserRole
5、异常( Exception )的命名
异常( Exception ) 通常采用字母 e 表示异常,对于自定义的异常类,其后缀必须为 Exception
如: BusinessException
6、方法( Method )的命名
方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。
方法名尽可能的描述出该方法的动作行为。返回类型为 Boolean 值的方法一般由“ is ”或“ has ”来开头
如: getCurrentUser() 、 addUser() 、 hasAuthority()
7、参数( Param )的命名
第一个单词的首字母小写,其后单词的首字母大写。参数量名不允许以下划线或美元符号开头,
虽然这在语法上是允许的。参数名应简短且富于描述。
如: public UserContext getLoginUser(String loginName);
8、常量字段 ( Constants )的命名
静态常量字段( static final ) 全部采用大写字母,单词之间用下划线分隔;
如: public static final Long FEEDBACK;
public static Long USER_STATUS;
1. 风格务必保持一贯性(Consistent)
一位同胞顶着我的鼻子问,为什么我们的Java代码缩进格式非得是这样,而不能是他那样,他就是喜欢他自己的这一种,因此他写的代码总是用他自己习惯的风格。结果在Code Review里被大家毙掉,责令修改。因此他是大大地不服。就是风格一贯性问题。其实他的风格,本来也没有什么问题,但在项目里,和其他程序员的程序的风格,显得扃异,那就存在问题了。比如这个缩进,又比如变量命名方法,不同的类,不同的Methods里,各自不同,这程序就很难看了。所以一旦你选择了某种风格,一定要贯彻始终。如果一个项目里规定了一个风格,即便很不符合你自己的习惯,也要贯彻始终,绝不应该有标新立异。
2. 缩进风格(indent)
既然是从缩进说起,就先说说缩进风格;一般来说,象Java这样的类C语言,都采用缩进风格。而常用的,有四种
A.K&R风格
这是C程序最早的缩进风格,由C的发明者Ritchie和他的合作者Kernighan率先使用:
if (<cond>) {
<body>
}
其特点,是大括号和if判断在同一行。通常,缩进为8个空格或一个tab键,但在C++和Java里,也常缩进4个空格。有人喜欢用两个空格,窃以为不好,不明显。
B. BSD 风格
又称Allman Style,源自Unix BSD程序员Eric Allman--他为BSD写过很多程序:
if (<cond>)
{
<body>
}
特点:大括号和条件判断分在两行。
C. Whitesmith风格
这种风格源于Whitesmith C:
if (<cond>)
{
<body>
}
D. GNU风格
这种风格仅见于GNU EMACS的源程序中:
if (<cond>)
{
<body>
}
那么在Java里用哪种好呢?建议只采用A或B。SUN有一个Java Code Name Convention,建议的是A。
3. Tab还是空格(Tabs vs Space)
还是缩进问题。那么一次缩进应该多大距离?是八个空格键,还是一个Tab键?
Java有一个特点,就是跨平台性。不过跨平台指的是它的Class可以在不同平台的虚拟机上运行。Java的源程序,有时候可不是跨平台的。什么?源程序还能不跨平台?是的。有次一个程序员送来一些Code,在我的环境里打开,程序难看得一塌糊涂,有该缩进的地方,没有缩进,有的则缩进一大截,如同怪石一样,嶙峋参差。这样的代码质量可不行!叫来程序员一问,答曰在他那里漂亮得很啊,他还专门花时间去美化它们了呢?
原来他的缩进没有注意一个风格,在有的地方用Tab键,有的地方打空格。在一些不同的平台上,Tab键的宽度可是不一样的。
说道这里,相信大家比较清楚了,在缩进的时候,尽量不用Tab,而是用空格。好在许多编辑器,都可以把你的键盘上的Tab键定义成几个空格。赶紧去定义它!
每次用多少空格呢?4个。2个太少不明显,8个太多占空间。
4. 行宽
说道8个空格键占空间,那么我一行有320列,8个空格算什么?打住!请寄住,一行尽量不要超过80列。许多终端一个屏幕只能显示80列,为它们想想巴。如果你的语句太长,想办法折断它,分几列来写。
5. 变量命名
SUN Java Code Convention里定义了Java里package, class, method和普通变量的命名规则,我就不用再浪费字节了。这里提提一些注意事项和一些SUN没提到但大家常用的方式。
a. 用有意义的名字命名变量
首先,用完整的英语单词或约定俗成的简写命名你的变量,如:
firstName
zipCode
如果英语不够好,至少用别人看得懂的拼音命名,如
zhuZhi (住址)
胡乱简写,或者胡乱命名,则没有人看得懂你的变量的含义:
fn
zc
zz
b. 常量用全大写加下画线命名
Java里的常量,就是static final:
static final SMTH_BBS="bbs.tsinghua.edu.cn";
c. 用复数命名collection类变量
collection包括数组,vector等。命名时请用复数:
customers
classMates
也可以用一些修饰词命名:
someStudents
allDepartments
d. 循环变量
一般大家都用i, j, k等做循环变量。
e. Stream变量
一般习惯用in, out作为Stream变量,对应inputStream, outputStream
类。如果即读又写的ioStream,可以用inOut。
f. 变量的命名习惯
习惯MFC的人喜欢采用匈牙利命名法(Hungarian Notation)。如果你习惯这样,尽管用,但注意要和同Project的人保持一致。还有些人习惯C++里的下画线方式,也可以采用。
Hungarian Notation:
sFirstName
Under Score Style:
_firstName
这里提供一个Hungarian Notation的前缀命名习惯:
int i
byte b
char c
double d
float f
long l
offset off
length len
Object o
String s (or str)
Arbitray value v
6. Java文件格式
有许多方式定义你的文件语句格式,以下是一个例子:
a. 文件头说明 (可无)
b. Package定义
c. 空行
d. Import语句
e. 空行
f. 类定义
如:
package com.midi;
//Java Classes
import java.awt.*;
import java.io.*;
import javax.swing.event.*;
//WebLogic Classes
import weblogic.internal.*;
/**
* Blah blah
* @author midi
* @version 22.2
*/
public class MyFirst extends JFrame {
...
}
/**
* Foo...
* @author midi
* @version 38.2
*/
class Foo {
...
}
7. import顺序
杂乱无章的顺序,看起来很不顺眼。应该对你要import的classes归类,按顺序罗列:
a. Java标准类(java.*)
b. Java扩充类(javax.*)
c. 第三方类
d. 你的应用程序的类
而且注意在第三方类里注释它们,说明它们的来源:
import java.*;
import java.util.Date;
import java.util.Enumeration;
import javax.sql.*;
//Apache Xerces
import org.apache.xml.*;
import org.apache.xerces.dom.*;
//Application classes
import com.midi.util.*;
8. Classes的顺序
a. Javadoc注释或者其它文件头注释
b. 类声明
c. Fields声明
d. 空行
e. 构造函数
f. 空行
g. 方法(不包括main)
h. 空行
i. Inner类
j. 空行
k. main()
例:
/**
* This is a simple DOM tree XML parser...
* ...
* @author: midi
* @version: 0.0.1
**/
public class MyParser {
// public constants
public static final String TITLE = "MyParser";
public static final String VERSION = "0.0.1";
// Private variables
private int iSchemaVersion;
/**
* Constructor
*/
public MyParser () {
iSchemaVersion = 1;
}
/**
* Constructor
* @param...
*/
public MyParser (iSchemaVersion) {
this.iSchemaVersion = iSchemaVersion;
}
/**
* Initialize the parser...
*/
public void myInit () throws Exception {
....
}
/**
* start the application
*/
public static void main (String[] argvs) {
...
}
}
9. Field定义
请遵从以下顺序:
a. Public常量
b. Public变量
c. Protected常量
d. Protected变量
e. Package常量
f. Package变量
g. Private常量
h. Private变量
另:本文仅限IT爱好者交流
该文引自百度文库,如有雷同,纯属巧合,本文最终解释权归此博主所有。