轉載請附帶本文地址,謝謝!
1. 命名應該和實際意義相符合
反例:
int w;
int h;
public int fun(){
return w*h;
}
從代碼中看不出任何信息,w和h是何含義?
不如改爲:
int width;
int height;
public int calculateArea(){
return width*height;
}
這樣沒有註釋也能看懂代碼的意圖.
2.避免誤導
如果僅僅給你一個accountList,很容易讓人誤以爲是一個賬戶類表.
Account[] accountList;
//此處又很長的代碼
accountList = getAccountList(); //你能辨別出accountList是什麼嗎?
爲了避免誤導,應該改爲:
Account[] accountGroup;
//此處又很長的代碼
accountGroup = getAccountGroup(); //你能辨別出accountGroup是什麼嗎?
3.做有意義的區分
現在有三個類:
public class Account{}
public class AccountInfo{}
public class AccountData{}
僅僅從類名你能區分這三個類有什麼區別嗎?
既然要區分他們就應該取一個有意義的名稱區分.
4.用讀得出的名稱
有的程序員喜歡用自造的詞語,比如:
public void lxmcreateData(){
//代碼內容
}
你能讀出來上面函數的名稱嗎?函數本意是想創造數據,但是lxm是什麼意思?翻到類頭註釋才知道,作者叫Lixiaoming.
如果改爲下面這樣,是不是更好讀呢?
public void createData(){
//代碼內容
}
5.用可搜索的名稱
經常在代碼中可以見到類似a,b,w,h,e等這樣的命名,而且同一個類中多次出現,特別是作爲臨時變量的i,j,k.當想查找時,編輯器也不知道你想要查找哪一個.
例如:
private List<Student> studentList;
public float getMathAvgScore(){
float s = 0;
for(int i = 0; i < studentList.size(); i++){
s = s + studentList.get(i).getMathScore();
}
float a = s/studentList.size();
return a;
}
public float getAvgScore(){
float s = 0;
for(int i = 0; i < studentList.size(); i++){
s = s + studentList.get(i).getTotalScore();
}
float a = s/studentList.size();
return a;
}
如果改爲下面這樣,你覺得哪個更好呢?
private List<Student> studentList;
public float getMathAvgScore(){
float mathTotalScore = 0;
for(Student student : studentList){
mathTotalScore = mathTotalScore + student.getMathScore();
}
float mathAvgScore = mathTotalScore/studentList.size();
return mathAvgScore;
}
public float getAvgScore(){
float totalScore = 0;
for(Student student : studentList){
totalScore = totalScore + student.getTotalScore();
}
float avgTotalScore = totalScore/studentList.size();
return avgTotalScore;
}
6.不要使用命名編碼
什麼是命名編碼?就像前面的lxmcreateData()函數名就是命名編碼.
命名前綴
就像前面的lxmcreateData()一樣,該類中存在很多類似lxmXXX的函數,變量.
在命名時應避免使用這樣的前綴
命名後綴
使用Eclipse時,我們生命一個變量時,往往會給出命名提示:
String nameString
這是很不必要的,不需要在變量後面都帶上該變量的類型,除非該變量的命名不足以表現出其類型.
7.避免思維映射
每一個變量應明確其含義,不要讓人在大腦中給其一個含義映射!
比如:
for(int i = 0; i < studentList.size(); i++){
s = s + studentList.get(i).getMathScore();
}
與下面相比:
for(Student student : studentList){
mathTotalScore = mathTotalScore + student.getMathScore();
}
下面的代碼更直觀,而上面的代碼會讓人去記住s代表什麼含義.
8.類名
類名和對象名應該是名詞活名詞短語,如Customer,WikiPage,Account,AccountParser等,避免使用Manager,Processor,Data,Info等這樣的類名.類名不應該是動詞.
9.方法名
方法名應該是動詞或動詞短語,如postPayment,deletePage或save.
屬性訪問與修改和斷言應該根據其命名,並依照javabean標準加上get,set,is前綴.
如:
String name = person.getName();
person.setName("Jack");
player.isPlaying();
10.別裝幽默
命名應該是直來直去的名稱,不要使用一些俗語或俚語(不要以爲別人都和你一樣英文閱歷很深).
別用whack()來表示kill().
11.每個概念對應一個詞
如果你要寫一個控制類,比如控制音頻類.如果使用了AudioManager就不要在使用AudioController.否則別人是弄不懂二者之間區別.
12.別用雙關語
比如add一詞又很多含義,不要爲了保持方法名一致就命名爲add.
把單個條目放到集合中可以用put,不要用add;
把單個條目放大數據庫中可用insert,不要用add.
13.使用解決方案領域的名稱
有時同一個事物在不同領域有不同的含義,在寫代碼的過程中要用和項目相關領域的詞彙命名.
14.使用源自於所涉及問題領域的名稱
儘量使用問題所在的領域的詞語來命名,這樣可以明確代碼解決問題的領域.
15.添加有意義的語境
有些詞語會有一詞多義的現象,如果找不到代替該詞更好名稱,那麼至少給該詞添加能明確含義的語境.
16.不要添加沒用的語境.
就像前面的lxmcreateData()一樣,前綴lxm是沒有任何含義的.一定不要附帶這樣的沒有意義的語境.