`
qiufeihu
  • 浏览: 33286 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

命名及编码规范

阅读更多
命名规范:
命名标准:
Camel 标记法:首字母是小写的,接下来的单词都以大写字母开头。
1.包的命名
Java包的名字都是由小写单词组成。
例如:com.haorizi.hzw
2.类、接口的命名
Java类名通常以大写字母开头,如果类名称由多个单词组成,则每个单词的首字母均应为大写:
例如:OrderService
如果类名称中包含单词缩写,则这个所写词的每个字母均应大写:
例如:SQLService
3.方法的命名
方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头。
例如:printMessage
4.常量的命名
常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词。
例如:MAX_VALUE
5.属性、参数的命名
属性、参数的命名规范和方法的命名规范相同。
代码规范:
1.缩进排版(Indentation)
4个空格常被作为缩进排版的一个单位。
2.行长度(Line Length)
尽量避免一行的长度超过80个字符,因为很多终端和工具不能很好处理之。
注意:用于文档中的例子应该使用更短的行长,长度一般不超过70个字符。
3.换行(Wrapping Lines)
当一个表达式无法容纳在一行内时,可以依据如下一般规则断开之:
在一个逗号后面断开
在一个操作符前面断开
宁可选择较高级别(higher-level)的断开,而非较低级别(lower-level)的断开
新的一行应该与上一行同一级别表达式的开头处对齐
断开方法调用的一些例子:
someMethod(longExpression1, longExpression2, longExpression3, 
                   longExpression4, longExpression5);
       
longName1 = longName2 * (longName3 + longName4 - longName5)
                     + 4 * longname6; //PREFFER

if语句的换行通常使用8个空格的规则,因为常规缩进(4个空格)会使语句体看起来比较费劲。比如:
//DON’T USE THIS INDENTATION
if ((condition1 && condition2)
    || (condition3 && condition4)
    ||!(condition5 && condition6)) { //BAD WRAPS
    doSomethingAboutIt();             //MAKE THIS LINE EASY TO MISS
}
//USE THIS INDENTATION INSTEAD
if ((condition1 && condition2)
        || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
}
//OR USE THIS
if ((condition1 && condition2) || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
}

这里有三种可行的方法用于处理三元运算表达式:
alpha = (aLongBooleanExpression) ? beta : gamma;
alpha = (aLongBooleanExpression) ? beta
                                 : gamma;
 

4.实现注释的格式(Implementation Comment Formats)
4.1 单行注释(Single-Line Comments)
短注释可以显示在一行内,并与其后的代码具有一样的缩进层级。如果一个注释不能在一行内写完,就该采用块注释(参见"块注释")。单行注释之前应该有一个空行。以下是一个Java代码中单行注释的例子:
if (condition) {
    /* Handle the condition. */
     ...
}
 

4.2 尾端注释(Trailing Comments)
极短的注释可以与它们所要描述的代码位于同一行,但是应该有足够的空白来分开代码和注释。若有多个短注释出现于大段代码中,它们应该具有相同的缩进。
以下是一个Java代码中尾端注释的例子:
if (a == 2) {
    return TRUE; /* special case */
} else {
    return isPrime(a); /* works only for odd a */
}

4.3 行末注释(End-Of-Line Comments)
注释界定符"//",可以注释掉整行或者一行中的一部分。它一般不用于连续多行的注释文本;然而,它可以用来注释掉连续多行的代码段。以下是所有三种风格的例子:
if(foo > 1) {
    // Do a double-flip.     
    ...
} else {     
    return false;          // Explainwhy here.
}
  
//if (bar > 1) {
// 
//    // Do a triple-flip. 
//    ...
//} 
//else { 
//    return false;
//}
 

5.声明(Declarations)
5.1每行声明变量的数量(Number Per Line)
推荐一行一个声明,因为这样以利于写注释。亦即,
int level;  // indentation level
int size;   // size of table

不要将不同类型变量的声明放在同一行,例如:
int foo, fooarray[];   //WRONG!
注意:上面的例子中,在类型和标识符之间放了一个空格,另一种被允许的替代方式是使用制表符:
int          level;         // indentation level
int          size;          // size of table 
Object       currentEntry;  // currently selected table entry

5.2 布局(Placement)
只在代码块的开始处声明变量。(一个块是指任何被包含在大括号"{"和"}"中间的代码。)不要在首次用到该变量时才声明之。这会把注意力不集中的程序员搞糊涂,同时会妨碍代码在该作用域内的可移植性。
void myMethod() {     
int int1 = 0;         // beginningof method block
      
if (condition) {         
int int2 = 0;     // beginning of "if" block
          ...     
    }
}

该规则的一个例外是for循环的索引变量
for (int i = 0; i < maxLoops; i++) { ... }
避免声明的局部变量覆盖上一级声明的变量。例如,不要在内部代码块中声明相同的变量名:
int count;
  ... 
myMethod() {     
    if (condition) {         
        int count = 0;     // AVOID!         
        ...     
    }     
    ...
}
 

5.3 类和接口的声明(Class and Interface Declarations)
当编写类和接口是,应该遵守以下格式规则:
       - 在方法名与其参数列表之前的左括号"("间不要有空格
       - 左大括号"{"位于声明语句同行的末尾
       - 右大括号"}"另起一行,与相应的声明语句对齐,除非是一个空语句,"}"应紧跟在"{"之后
class Sample extends Object {     
       int ivar1;
       int ivar2;
     
       Sample(int i, int j) {         
       ivar1 = i; 
       ivar2 = j;     
       }
     
       int emptyMethod() {}
       ...
 }

        - 方法与方法之间以空行分隔
6 语句(Statements)
6.1 简单语句(Simple Statements)
每行至多包含一条语句,例如:
argv++;           //Correct 
argc--;           //Correct
argv++; argc--;   //AVOID!

6.2 复合语句(Compound Statements)
复合语句是包含在大括号中的语句序列,形如"{ 语句 }"。例如下面各段:
           - 被括其中的语句应该较之复合语句缩进一个层次
           - 左大括号"{"应位于复合语句起始行的行尾;右大括号"}"应另起一行并与复合语句首行对齐。
           - 大括号可以被用于所有语句,包括单个语句,只要这些语句是诸如if-else或for控制结构的一部分。这样便于添加语句而无需担心由于忘了加括号而引入bug。

6.3 返回语句(return Statements)
一个带返回值的return语句不使用小括号"()",除非它们以某种方式使返回值更为显见。例如:
return; 
return myDisk.size(); 
return (size ? size : defaultSize);
6.4 if,if-else,if else-if else语句(if, if-else, if else-if else Statements)

if-else语句应该具有如下格式:
if(condition) {     
     statements;
  }
 
if (condition) {  
    statements;
  }else {     
    statements;
  }
 
if (condition) {
    statements;
  }else if (condition) {    
    statements;
  }
else{    
    statements;
}

注意:if语句总是用"{"和"}"括起来,如果仅是简单的一条判断,可用以下格式:
if(condition) 
    statement;

6.5 for语句(for Statements)
一个for语句应该具有如下格式:
for(initialization; condition; update) {    
    statements;
  }

一个空的for语句(所有工作都在初始化,条件判断,更新子句中完成)应该具有如下格式:
for (initialization; condition; update);
当在for语句的初始化或更新子句中使用逗号时,避免因使用三个以上变量,而导致复杂度提高。若需要,可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。
6.6 while语句(while Statements)
一个while语句应该具有如下格式:
while (condition) {     
    statements;
}

一个空的while语句应该具有如下格式:
while(condition);
6.7 do-while语句(do-while Statements)
一个do-while语句应该具有如下格式:
do {    
    statements;
}
while (condition);

6.8 switch语句(switch Statements)
一个switch语句应该具有如下格式:
switch (condition) { 
case ABC:
    statements;     
    /* falls through */
case DEF:   
    statements;     
    break;
case XYZ:
    statements;
    break;
default:    
    statements;   
    break;
}

每当一个case顺着往下执行时(因为没有break语句),通常应在break语句的位置添加注释。上面的示例代码中就包含注释/* falls through */。
6.9 try-catch语句(try-catch Statements)
一个try-catch语句应该具有如下格式:
try {     
    statements;
}
catch (ExceptionClass e) {     
    statements;
}

一个try-catch语句后面也可能跟着一个finally语句,不论try代码块是否顺利执行完,它都会被执行。
try {     
    statements;
  }
catch (ExceptionClass e) {
    statements;
  }
finally {
    statements;
  }

7 空白(White Space)
7.1 空行(Blank Lines)
空行将逻辑相关的代码段分隔开,以提高可读性.下列情况应该总是使用两个空行:
         - 一个源文件的两个片段(section)之间
         - 类声明和接口声明之间
下列情况应该总是使用一个空行:
        - 两个方法之间
        - 方法内的局部变量和方法的第一条语句之间
        - 块注释(参见"5.1.1")或单行注释(参见"5.1.2")之前
        - 一个方法内的两个逻辑段之间,用以提高可读性
7.2 空格(Blank Spaces)
下列情况应该使用空格:
           - 一个紧跟着括号的关键字应该被空格分开,例如:
while (true) {     
   ...
}

注意:空格不应该置于方法名与其左括号之间。这将有助于区分关键字和方法调用。
       - 空白应该位于参数列表中逗号的后面
       - 所有的二元运算符,除了".",应该使用空格将之与操作数分开。一元操作符和操作数之间不因该加空格,比如:负号("-")、自增
   ("++")和自减("--")。例如:
a +=c + d;
 a = (a + b) / (c * d);
    
while (d++ = s++) {      
    n++;
}  
printSize("size is " + foo + "\n");

        - for语句中的表达式应该被空格分开,例如:
for (expr1; expr2; expr3)

       - 强制转型后应该跟一个空格,例如:
myMethod((byte) aNum, (Object) x);   
myMethod((int) (cp + 5), ((int) (i + 3)) + 1);

8 引用类变量和类方法(Referring to Class Variables and Methods)
避免用一个对象访问一个类的静态变量和方法。应该用类名替代。例如:
classMethod();             //OK 
AClass.classMethod();      //OK 
anObject.classMethod();   //AVOID!

8.1 变量赋值(Variable Assignments)
避免在一个语句中给多个变量赋相同的值。它很难读懂。例如:
fooBar.fChar = barFoo.lchar = 'c'; // AVOID!
不要将赋值运算符用在容易与相等关系运算符混淆的地方。例如:
if(c++ = d++) {        // AVOID! (Javadisallows)    
    ...
}

应该写成
if ((c++ = d++) != 0) {  
...
}

不要使用内嵌(embedded)赋值运算符试图提高运行时的效率,这是编译器的工作。例如:
d = (a = b + c) + r;        // AVOID!

应该写成
a =b + c;
d =a + r;

8.2 圆括号(Parentheses)
一般而言,在含有多种运算符的表达式中使用圆括号来避免运算符优先级问题,是个好方法。即使运算符的优先级对你而言可能很清楚,但对其他人未必如此。你不能假设别的程序员和你一样清楚运算符的优先级。
if(a == b && c == d)      // AVOID!
if((a == b) && (c == d))  // RIGHT

8.3 返回值(Returning Values)
设法让你的程序结构符合目的。例如:
if(booleanExpression) {
    return true;
}else {
    return false;
}

应该代之以如下方法:
return booleanExpression;

类似的:
if(condition) {
   return x;
}
return y;

应该写做:
return (condition ? x : y);

8.4 条件运算符"?"前的表达式(Expressions before '?' in the Conditional Operator)
如果一个包含二元运算符的表达式出现在三元运算符" ? : "的"?"之前,那么应该给表达式添上一对圆括号。例如:
(x >= 0) ? x : -x;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics