很久以來都在體會(huì)著JAVA的風(fēng)格,現(xiàn)在做一簡(jiǎn)單陳述,希望大家多提寶貴意見。
對(duì)于一種好的編程語(yǔ)言,學(xué)習(xí)它的編程風(fēng)格是很重要的。每種語(yǔ)言都有自己的編寫和注釋約定,當(dāng)然所有語(yǔ)言都建立在最基本的約定之上。編程中最重要的并不是讓代碼按自己希望的方式運(yùn)行,而是程序中那種自明的編程風(fēng)格(這對(duì)于程序員的益處相信眾多程序員都身有體會(huì))!但這還不夠,程序還應(yīng)該具有可讀、相對(duì)持久和可維護(hù)性。可讀性非常重要,因?yàn)槟悴幌M约阂郧暗淖髌吩谥蟮拈喿x中給自己留下障礙,當(dāng)然,更重要的是自己的程序能讓其他程序員讀懂并且修改。
下面我把工作中所理解的java風(fēng)格做一簡(jiǎn)單總結(jié),這是我所理解的好的編程風(fēng)格和應(yīng)用中我們應(yīng)當(dāng)如何使用java編寫自己的代碼的小Guide。這并不完全,希望大家?guī)臀谊懤m(xù)總結(jié)各自的經(jīng)驗(yàn)。
一般性概述
好的編程風(fēng)格固然重要,但是你一定聽說過一些程序員的個(gè)人風(fēng)格。其實(shí)我們完全不必為那些所謂條條框框所累,但是作為原則是我們至少不能打破這些常規(guī)。我們應(yīng)該在保持自己風(fēng)格的同時(shí)盡量的把自己與編程潛原則靠攏。
可讀性很容易達(dá)到,比如,讓自己的代碼縮排排列、名字采用描述性但不要過長(zhǎng)(短名應(yīng)僅僅用在非遠(yuǎn)程)、特殊名稱比如pi應(yīng)當(dāng)被定義為final類型。模塊性是編程需要注意的另一重點(diǎn),把代碼劃分到類里,在類中把功能劃分到方法中,別讓一個(gè)類太大,否則在使用、修改和理解上都會(huì)造成不必要的麻煩,方法也一樣,如果一個(gè)方法長(zhǎng)度超過50行,它產(chǎn)生錯(cuò)誤的概率將接近100%,盡量把大方法劃分為小方法,編程中為避免重復(fù)編寫,還應(yīng)盡量調(diào)用JAVA標(biāo)準(zhǔn)類庫(kù)。
盡量避免在寫代碼和注釋時(shí)使用不同語(yǔ)言,經(jīng)常見到論壇有朋友詢問諸如在java中調(diào)用c、調(diào)用php、調(diào)用shell之類的問題,其實(shí)在編程中,我們應(yīng)盡量使用一種語(yǔ)言去完成事情。另外就是不必最優(yōu)化自己的代碼,應(yīng)該選擇相對(duì)較優(yōu)的算法就可以了。
類、方法和fields
類應(yīng)體現(xiàn)出某種物質(zhì)的基本概念,比如要編程實(shí)現(xiàn)“汽車”的組成,那么所有的汽車都可以用類Car實(shí)現(xiàn)。這個(gè)類應(yīng)當(dāng)包括域描述、屬性描述和car的狀態(tài)(color, number of doors, age等)和由car可完成的操作(getColor, setColor等)。為了提高類的可重用性,不要在類中有過多的描述,當(dāng)然這也會(huì)增加錯(cuò)誤產(chǎn)生的機(jī)會(huì)。
類名首字母大寫,比如Date, String, Hashtable等 ... ...
類如下定義:(未使用Javadoc做注釋):
代碼: |
public class Car { /* Instance variables are placed either in the beginning or at the end of the class */ private int age; private Color color; /* The constructor should be placed in the beginning */ public Car(int age, Color color) { this.age = age; this.color = color; } /* Example method */ public int getAge() { return age; } /* The main method is optional, but looks like this. If it exists, it is either the first or the last method in the class */ public static void main(String [] args) { ... } } |
注意類名和大括號(hào)間的空格!
方法
方法一般定義為public。當(dāng)然,如果方法僅僅在當(dāng)前類用到可以定義為private,而如果希望一個(gè)子類沿用這個(gè)方法則不同,這時(shí)候的方法應(yīng)定義為protected。
java中的方法定義很有趣,它們一般小寫字母開頭,如果有兩個(gè)字組成,第二個(gè)字的首字母則大寫。因此名字的描述性是至關(guān)重要的。這使你不用閱讀整篇代碼來判斷這是一個(gè)什么方法。在給自己的方法取名時(shí)應(yīng)盡量不要太短或者太長(zhǎng),另一個(gè)需要注意的是大多方法使用動(dòng)詞(動(dòng)賓短語(yǔ))。
例如:
public void eat() {}
public void eatBananas() {}
Selector(選擇器)方法有g(shù)et前綴,后綴是它們將要get的,比如
public int getBananas() {}
Mutator(存取器)方法則有set前綴,后綴則是他們要set的,比如
public void setBananas(int amount) {}
注意mutators大多無(wú)返回值。
方法的參數(shù)應(yīng)當(dāng)以如下方式給出:
public void aMethod(type parameter1, type parameter2, ... , type parametern) {}
如果參數(shù)過長(zhǎng),也可以斷開為幾行,應(yīng)對(duì)齊向下排列如:
public void aMethod(type parameter1, type parameter2,... ,
type parametern, type parameter n+1,... ,
type parameterm, type parameter m+1) {}
另外要注意類的左束括號(hào)應(yīng)在方法的右束括號(hào)之后而非下一行:
代碼: |
public int aMethod() { int i = 0; if(i == 0) System.out.println("success!"); } |
為了文件可讀性好,還要注意語(yǔ)句最好寫在同一行,當(dāng)然一行寫不下是可以斷行的,比如行字母超過80。
fields
比如變量,如果不希望它永久有效,應(yīng)設(shè)為private。如果一個(gè)變量在類中不發(fā)生任何動(dòng)作(比如數(shù)據(jù)結(jié)構(gòu)中的node)則可以設(shè)置為public,常量一般聲明為public。如果不能確定一個(gè)變量到底該聲明為什么,應(yīng)暫且聲明為private。
field的名字一般使用小寫字母,不要使用下橫線或其他特殊字符。 如果變量包含兩個(gè)字,那么第二個(gè)字的首字母大寫。比如:
int i, j, k;
Date date;
double myField;
常量一般全部大寫,也可以包含下橫線:
public static final int MAX_SIZE_OF_DATABASE
fields的名字通常為名詞。較重要的fields更應(yīng)具備描述性,比如程序中包含一個(gè)游戲的得分,那可以用score來代表。如果變量變化較頻繁,那使用一個(gè)單一字符來代表就ok了:
i, j, k 通常代表整數(shù)
r, t, u, v, w 通常代表實(shí)數(shù)
x, y, z 通常是并列出現(xiàn)或代表浮點(diǎn)數(shù)
s, s1, s2, 通常代表字符串
c, ch 通常代表字符
f, file 通常代表文件
tmp, temp 通常代表臨時(shí)變量
ctr, cnt, cntr 一般代表計(jì)數(shù)器(如果i, j, k這些變量已被使用)
dummy, foo, bar 一般代表啞元變量
args 是main-method的主參數(shù)名
縮排與換行
每行長(zhǎng)度不得超過80字符。如果需要可以折行時(shí),也應(yīng)當(dāng)與上一行有共同的縮排距離。代碼應(yīng)如何交錯(cuò)、如何建立新行、在哪里建立允許、哪里不允許都有一些一般約定,縮排空格一般為2個(gè)或4個(gè)空格。
條件表達(dá)式
如果見到如下語(yǔ)法表達(dá)式:
代碼: |
if (expr) statement1; else statement2; |
代碼行向右錯(cuò)排兩個(gè)空格如上所示。
如果在一個(gè)表達(dá)式中有超過一條的聲明,則需要大括號(hào):
代碼: |
if (expr){ statement1; statement2; } else{ statement3; statement4; } |