標籤:nts 欄位 劃線 doc author start 不用 col 項目
java程式書寫規範
命名規範
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變數
JAVA書寫規範