9 使用有意义的名字
当命名一个类,变量,方法,常量的时候,它们是什么,就用什么名字,这样对于将要阅读你程序的人来说,非常有意义。选择一个有意义的词汇,避免使用单字符或者一般的词汇来定义。
在下面的例子中,变量a和常量65是非常的含糊不清的
if (a < 65) {
y = 65 - a;
} else {
y = 0;
}
当使用一个有意义的名字后,变得非常容易理解
if (age < RETIREMNT_AGE) {
yearsToRetirement = RETIREMNT_AGE - age;
} else {
yearsToRetirement = 0;
}
但是当这个变量可以充分解释目的的时候,就可以忽略这个原则,比如像一个循环中的常量
for (int i =0; i < numberOfStudents; i++ ) {
enrollStudent(i);
}
一些变量用得非常多,已经成为标准,具体参照规则28
10 使用熟悉的名称
使用一个相对于目标领域熟悉的名称。如果你的客户对于clients的理解是customers,那么用Cstomer来定义这个类,而不是Clinet。使用对你目标领域来说有意义的,熟悉的名称,而不是你熟悉的名称。
11 质疑现存的长名字
一个对象的名称应该描述的是它的目的。如果一个类,接口,变量或者方法拥有一个过分长的名称的话,那么这个实体可能试图完成太多,也就是超出它的能力范围。
用一个简单的名字来给于一个实体较少的功能,能力,首先需要确定这个实体的设计和目的是什么。可能需要重构一个实体,也许会产生出新的类,接口,方法或者变量来使方法聚焦在自己所应该做的,和符合这个简单名字的意义。
12 用元音字母连接
缩写降低代码的可读性和增加更多的含糊不清。不要尝试去除元音字母去减少名称的长度。
下面的例子,读者可以很清晰的明白
public Message appendSignature(Message message,String signature){
...
}
而如果缩短了名字就会增加了理解的难度
public Msg appndSgntr(Msg msg,String sgntr) {
}
如果你去除元音字母,只是为了简短长名称的话,那么你需要问问自己,改变后是否和原来的意义相同或者接近呢。
13 只大写每个单词的首字母
这个规则是为了用大写来分割单词,减少迷惑。它对于一个单词接着一个单词来说非常有意义。
setDSTOffset() setDstOffset()
loadXMLDocument() loadXmlDocument()
该原则不适用于
常量只能拥有大写字母
static final String XML_DOCUMENT = “text/XML”;
每个方法,变量,参数的名字的首字母必须是大写。
Private Document xmlDocument;
14 不要使名字仅仅是语法不同
Java的编译器可以区分出语法的不同,可是人却很难注意到不同之处。
比如,一个变量命名为theSQLInputStream,那么就不要再同样的范围内出现这样的变量theSqlInputStream.如果这样的名称出现在同一范围内的话,那么会给后来阅读代码的带来很多不必要的迷惑和麻烦。
包命名
15 使用反转的,小写的你的域名作为包的节点名称。
任何的发布包都需要把域名小写,并且反转来命名。例如,如果一个公司名称为Bpu Soft。Internet域名为www.bpusoft.com。发布的应用程序的包为server,那么Bpu soft就要给包命名为com.bpusoft.server
16 使用单一的,小写的单词作为每个包的名称
一个好的,或者说合适的包的名称应该是由单一,小写的,并且清晰表达目的的,并且有用的单词构成。一个包的名字应该有意义的缩写。比如标准java包的名字java.io 和java.net.
17 只要当新的版本,与原来的版本兼容的时候,才可以使用相同的包名称,否则的话,新命名一个。
这个目的是为了保证两个相同名称的包的行为要是彼此兼容的。如果你有一个新的版本与原来的不兼容的话,你应该改变你的包的名称。不过有一个安全的简单的方法就是在每一个包的后面加上版本号
com.bpusoft.server.v1;
com.bpusoft.server.v2;
类型命名
18类或接口的每个单词的第一个字母大写
每个字母大写是为了分割每个单词,第一个字母大写是为了与变量的不同。
public class PrintStream
extends FilterOutputStream{
}
public interface ActionListener
extends EventListener {
}
类命名
19 用名词定义类
类定义的是对象或者事物。所以需要用名词定义:
class CustomerAccount{
...
}
public abstract class KeyAdapter
implements KeyListener {
...
}
20 使类的名字是一组有关联的属性,服务或者常量
类应该是由一组有协作的,相互关联的属性,服务或者常量定义的。
Java.awt.font.LineMetrics 类是一个管理者一组相关联的属性:
/**
* The LineMetrics
class allows
* access to the* metrics needed to layout
* characters along a line and to layout
* of a set of lines.
*/
abstract class LineMetrics {
public abstract int getNumChars();
public abstract float getAscent();
public abstract float getDescent();
public abstract float getLeading();
public abstract float getHeight();
}
java.beans.Bean 类定义了一组相关联的服务
/**
* This class provides some
* general purpose beans
* control methods.
*/
public class Beans {
public static Object instantiate(...){...};
public static Object getInstanceOf(...){...};
public static boolean isInstanceOf(...){...};
public static boolean isDesignTime(){...};
……………….
}
java.sql.Types是一个定义了一组常量的类
/**
*
The class that defines the constants
* that are used to identify generic
* SQL types.
*/
public class Types {
public final static int BIT = -7;
public final static int TINYINT = -6;
public final static int SMALLINT = 5;
public final static int INTEGER = 4;
public final static int BIGINT = -5;
public final static int FLOAT = 6;
public final static int REAL = 7;
public final static int DOUBLE = 8;
public final static int NUMERIC = 2;
}