這篇文章主要介紹了Java代碼書寫規(guī)范的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)服務(wù)項目包括自貢網(wǎng)站建設(shè)、自貢網(wǎng)站制作、自貢網(wǎng)頁制作以及自貢網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,自貢網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到自貢省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
一、目的
對于代碼,首要要求是它必須正確,能夠按照程序員的真實(shí)思想去運(yùn)行;第二個的要求是代碼必須清晰易懂,使別的程序員能夠容易理解代碼所進(jìn)行的實(shí)際工作。在軟件工程領(lǐng)域,源程序的風(fēng)格統(tǒng)一標(biāo)志著可維護(hù)性、可讀性,是軟件項目的一個重要組成部分。而目前還沒有成文的編碼風(fēng)格文檔,以致于很多時候,程序員沒有一個共同的標(biāo)準(zhǔn)可以遵守,編碼風(fēng)格各異,程序可維護(hù)性差、可讀性也很差。通過建立代碼編寫規(guī)范,形成開發(fā)小組編碼約定,提高程序的可靠性、可讀性、可修改性、可維護(hù)性、可繼承性和一致性,可以保證程序代碼的質(zhì)量,繼承軟件開發(fā)成果,充分利用資源,使開發(fā)人員之間的工作成果可以共享。
本文在參考業(yè)界已有的編碼風(fēng)格的基礎(chǔ)上,描述了一個基于 JBuilder 的項目風(fēng)格,力求一種統(tǒng)一的編程風(fēng)格,并從整體編碼風(fēng)格、代碼文件風(fēng)格、函數(shù)編寫風(fēng)格、變量風(fēng)格、注釋風(fēng)格等幾個方面進(jìn)行闡述。(這些規(guī)范并不是一定要絕對遵守,但是一定要讓程序有良好的可讀性)
二、整體編碼風(fēng)格
1、縮進(jìn)
縮進(jìn)建議以4個空格為單位。建議在 Tools/Editor Options 中設(shè)置 Editor 頁面的Block ident為4,Tab Size 為8。預(yù)處理語句、全局?jǐn)?shù)據(jù)、標(biāo)題、附加說明、函數(shù)說明、標(biāo)號等均頂格書寫。語句塊的"{"、"}"配對對齊,并與其前一行對齊,語句塊類的語句縮進(jìn)建議每個"{"、"}"單獨(dú)占一行,便于匹對。JBuilder 中的默認(rèn)方式是開始的"{"不是單獨(dú)一行,建議更改成上述格式(在 Project/Default Project Properties 中設(shè)置 Code Style 中選擇 Braces 為 Next line)。
2、空格
原則上變量、類、常量數(shù)據(jù)和函數(shù)在其類型,修飾名稱之間適當(dāng)空格并據(jù)情況對齊。關(guān)鍵字原則上空一格,如:if ( ... ) 等。運(yùn)算符的空格規(guī)定如下:"::"、"->"、"["、"]"、"++"、"--"、"~"、"!"、"+"、"-"(指正負(fù)號)、"&"(引用)等幾個運(yùn)算符兩邊不加空格(其中單目運(yùn)算符系指與操作數(shù)相連的一邊),其它運(yùn)算符(包括大多數(shù)二目運(yùn)算符和三目運(yùn)算符"?:"兩邊均加一空格,在作函數(shù)定義時還可據(jù)情況多空或不空格來對齊,但在函數(shù)實(shí)現(xiàn)時可以不用。","運(yùn)算符只在其后空一格,需對齊時也可不空或多空格。不論是否有括號,對語句行后加的注釋應(yīng)用適當(dāng)空格與語句隔開并盡可能對齊。個人認(rèn)為此項可以依照個人習(xí)慣決定遵循與否。
3、對齊
原則上關(guān)系密切的行應(yīng)對齊,對齊包括類型、修飾、名稱、參數(shù)等各部分對齊。另每一行的長度不應(yīng)超過屏幕太多,必要時適當(dāng)換行,換行時盡可能在","處或運(yùn)算符處,換行后最好以運(yùn)算符打頭,并且以下各行均以該語句首行縮進(jìn),但該語句仍以首行的縮進(jìn)為準(zhǔn),即如其下一行為“{”應(yīng)與首行對齊。
變量定義最好通過添加空格形成對齊,同一類型的變量最好放在一起。如下例所示:
int Value;
int Result;
int Length;
object currentEntry;
個人認(rèn)為此項可以依照個人習(xí)慣決定遵循與否。
4、空行
不得存在無規(guī)則的空行,比如說連續(xù)十個空行。程序文件結(jié)構(gòu)各部分之間空兩行,若不必要也可只空一行,各函數(shù)實(shí)現(xiàn)之間一般空兩行,由于每個函數(shù)還要有函數(shù)說明注釋,故通常只需空一行或不空,但對于沒有函數(shù)說明的情況至少應(yīng)再空一行。對自己寫的函數(shù),建議也加上“//------”做分隔。函數(shù)內(nèi)部數(shù)據(jù)與代碼之間應(yīng)空至少一行,代碼中適當(dāng)處應(yīng)以空行空開,建議在代碼中出現(xiàn)變量聲明時,在其前空一行。類中四個“p”之間至少空一行,在其中的數(shù)據(jù)與函數(shù)之間也應(yīng)空行。
5、注釋
注釋是軟件可讀性的具體體現(xiàn)。程序注釋量一般占程序編碼量的20%,軟件工程要求不少于20%。程序注釋不能用抽象的語言,類似于"處理"、"循環(huán)"這樣的計算機(jī)抽象語言,要精確表達(dá)出程序的處理說明。例如:"計算凈需求"、"計算第一道工序的加工工時"等。避免每行程序都使用注釋,可以在一段程序的前面加一段注釋,具有明確的處理邏輯。
注釋必不可少,但也不應(yīng)過多,不要被動的為寫注釋而寫注釋。以下是四種必要的注釋:
A. 標(biāo)題、附加說明。
B. 函數(shù)、類等的說明。對幾乎每個函數(shù)都應(yīng)有適當(dāng)?shù)恼f明,通常加在函數(shù)實(shí)現(xiàn)之前,在沒有函數(shù)實(shí)現(xiàn)部分的情況下則加在函數(shù)原型前,其內(nèi)容主要是函數(shù)的功能、目的、算法等說明,參數(shù)說明、返回值說明等,必要時還要有一些如特別的軟硬件要求等說明。公用函數(shù)、公用類的聲明必須由注解說明其使用方法和設(shè)計思路,當(dāng)然選擇恰當(dāng)?shù)拿袷侥軌驇椭惆咽虑榻忉尩酶宄?/p>
C. 在代碼不明晰或不可移植處必須有一定的說明。
D. 及少量的其它注釋,如自定義變量的注釋、代碼書寫時間等。
注釋有塊注釋和行注釋兩種,分別是指:"/**/"和"http://"建議對A用塊注釋,D用行注釋,B、C則視情況而定,但應(yīng)統(tǒng)一,至少在一個單元中B類注釋形式應(yīng)統(tǒng)一。具體對不同文件、結(jié)構(gòu)的注釋會在后面詳細(xì)說明。
6、代碼長度
對于每一個函數(shù)建議盡可能控制其代碼長度為53行左右,超過53行的代碼要重新考慮將其拆分為兩個或兩個以上的函數(shù)。函數(shù)拆分規(guī)則應(yīng)該一不破壞原有算法為基礎(chǔ),同時拆分出來的部分應(yīng)該是可以重復(fù)利用的。對于在多個模塊或者窗體中都要用到的重復(fù)性代碼,完全可以將起獨(dú)立成為一個具備公用性質(zhì)的函數(shù),放置于一個公用模塊中。
7、頁寬
頁寬應(yīng)該設(shè)置為80字符。源代碼一般不會超過這個寬度, 并導(dǎo)致無法完整顯示, 但這一設(shè)置也可以靈活調(diào)整. 在任何情況下, 超長的語句應(yīng)該在一個逗號或者一個操作符后折行. 一條語句折行后, 應(yīng)該比原來的語句再縮進(jìn)2個字符.
8、行數(shù)
一般的集成編程環(huán)境下,每屏大概只能顯示不超過50行的程序,所以這個函數(shù)大概要5-6屏顯示,在某些環(huán)境下要8屏左右才能顯示完。這樣一來,無論是讀程序還是修改程序,都會有困難。因此建議把完成比較獨(dú)立功能的程序塊抽出,單獨(dú)成為一個函數(shù)。把完成相同或相近功能的程序塊抽出,獨(dú)立為一個子函數(shù)。可以發(fā)現(xiàn),越是上層的函數(shù)越簡單,就是調(diào)用幾個子函數(shù),越是底層的函數(shù)完成的越是具體的工作。這是好程序的一個標(biāo)志。這樣,我們就可以在較上層函數(shù)里容易控制整個程序的邏輯,而在底層的函數(shù)里專注于某方面的功能的實(shí)現(xiàn)了。
三、代碼文件風(fēng)格
所有的 Java(*.java) 文件都必須遵守如下的樣式規(guī)則:
. 文件生成
對于規(guī)范的 JAVA 派生類,盡量用 JBuilder 的 Object Gallery 工具來生成文件格式,避免用手工制作的頭文件/實(shí)現(xiàn)文件。
. package/import
package 行要在 import 行之前,import 中標(biāo)準(zhǔn)的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應(yīng)該用 * 來處理。
package hotlava.NET.stats;
import java.io.*;
import java.util.Observable;
import hotlava.util.Application;
這里 java.io.* 使用來代替InputStream and OutputStream 的。
. 文件頭部注釋
文件頭部注釋主要是表明該文件的一些信息,是程序的總體說明,可以增強(qiáng)程序的可讀性和可維護(hù)性。文件頭部注釋一般位于 package/imports 語句之后,Class 描述之前。要求至少寫出文件名、創(chuàng)建者、創(chuàng)建時間和內(nèi)容描述。JBuilder 的 Object Gallery 工具生成的代碼中會在類、工程文件中等自動添加注釋,我們也要添加一些注釋,其格式應(yīng)該盡量約束如下:
/**
* Title: 確定鼠標(biāo)位置類
* Description: 確定鼠標(biāo)當(dāng)前在哪個作業(yè)欄位中并返回作業(yè)號
* @Copyright: Copyright (c) 2002
* @Company: HIT
* @author: rivershan
* @version: 1.0
* @time: 2002.10.30
*/
. Class
接下來的是類的注釋,一般是用來解釋類的。
/**
* A class representing a set of packet and byte counters
* It is observable to allow it to be watched, but only
* reports changes when the current set is complete
*/
接下來是類定義,包含了在不同的行的 extends 和 implements
public class CounterSet
extends Observable
implements Cloneable
.Class Fields
接下來是類的成員變量:
/**
* Packet counters
*/
protected int[] packets;
public 的成員變量必須生成文檔(JavaDoc)。proceted、private和 package 定義的成員變量如果名字含義明確的話,可以沒有注釋。
. 存取方法
接下來是類變量的存取的方法。它只是簡單的用來將類的變量賦值獲取值的話,可以簡單的寫在一行上。(個人認(rèn)為盡量分行寫)
/**
* Get the counters
* @return an array containing the statistical data. This array has been
* freshly allocated and can be modified by the caller.
*/
public int[] getPackets()
{
return copyArray(packets, offset);
}
public int[] getBytes()
{
return copyArray(bytes, offset);
}
public int[] getPackets()
{
return packets;
}
public void setPackets(int[] packets)
{
this.packets = packets;
}
其它的方法不要寫在一行上
. 構(gòu)造函數(shù)
接下來是構(gòu)造函數(shù),它應(yīng)該用遞增的方式寫(比如:參數(shù)多的寫在后面)。
訪問類型("public","private" 等.)和任何"static","final"或"synchronized"應(yīng)該在一行中,并且方法和參數(shù)另寫一行,這樣可以使方法和參數(shù)更易讀。
public
CounterSet(int size)
{
this.size = size;
}
. 克隆方法
如果這個類是可以被克隆的,那么下一步就是 clone 方法:
public
Object clone()
{
try
{
CounterSet obj = (CounterSet)super.clone();
obj.packets = (int[])packets.clone();
obj.size = size;
return obj;
}
catch(CloneNotSupportedException e)
{
throw new InternalError("Unexpected CloneNotSUpportedException: "
+ e.getMessage());
}
}
. 類方法
下面開始寫類的方法:
/**
* Set the packet counters
* (such as when restoring from a database)
*/
protected final
void setArray(int[] r1, int[] r2, int[] r3, int[] r4)
throws IllegalArgumentException
{
//
// Ensure the arrays are of equal size
//
if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)
throw new IllegalArgumentException("Arrays must be of the same size");
System.arraycopy(r1, 0, r3, 0, r1.length);
System.arraycopy(r2, 0, r4, 0, r1.length);
}
. toString 方法
無論如何,每一個類都應(yīng)該定義 toString 方法:
public
String toString()
{
String retval = "CounterSet: ";
for (int i = 0; i < data.length(); i++)
{
retval += data.bytes.toString();
retval += data.packets.toString();
}
return retval;
}
. main 方法
如果main(String[]) 方法已經(jīng)定義了, 那么它應(yīng)該寫在類的底部.
四、函數(shù)編寫風(fēng)格
. 函數(shù)的命名
通常,函數(shù)的命名也是以能表達(dá)函數(shù)的動作意義為原則的,一般是由動詞打頭,然后跟上表示動作對象的名詞,各單詞的首字母應(yīng)該大寫。另外,還有一些函數(shù)命名的通用規(guī)則。如取數(shù),則用Get打頭,然后跟上要取的對象的名字;設(shè)置數(shù),則用Set打頭,然后跟上要設(shè)的對象的名字;而對象中為了響應(yīng)消息進(jìn)行動作的函數(shù),可以命名為On打頭,然后是相應(yīng)的消息的名稱;進(jìn)行主動動作的函數(shù),可以命名為Do打頭,然后是相應(yīng)的動作名稱。類似的規(guī)則還有很多,需要程序員多讀優(yōu)秀的程序,逐漸積累經(jīng)驗,才能作出好的函數(shù)命名。
. 函數(shù)注釋
系統(tǒng)自動生成的函數(shù),如鼠標(biāo)動作響應(yīng)函數(shù)等,不必太多的注釋和解釋;
對于自行編寫的函數(shù),若是系統(tǒng)關(guān)鍵函數(shù),則必須在函數(shù)實(shí)現(xiàn)部分的上方標(biāo)明該函數(shù)的信息,格式如下:
/**
* 函數(shù)名:
* 編寫者:
* 參考資料:
* 功 能:
* 輸入?yún)?shù):
* 輸出參數(shù):
* 備 注:
*/
希望盡量遵循以上格式。
五、符號風(fēng)格
. 總體要求
對于各種符號的定義,都有一個共通點(diǎn),就是應(yīng)該使用有實(shí)際意義的英文單詞或英文單詞的縮寫,不要使用簡單但沒有意義的字串,盡可能不使用阿拉伯?dāng)?shù)字,更切忌使用中文拼音的首字母。如這樣的名稱是不提倡的:Value1,Value2,Value3,Value4 …。
例如:
file(文件),code(編號),data(數(shù)據(jù)),pagepoint(頁面指針), faxcode(傳真號) ,address(地址),bank(開戶銀行),……
. 變量名稱
a. 變量名前綴的約定
變量類型 前綴 示例
integer int intCount
byte byt bytMove
short sht shtResult
long lng lngTotal
float flt fltAverage
double dbl dblTolerangce
boolean bln blnIsover
Char chr chrInput
Array arr arrData
變量名一般要有一定的表達(dá)義,變量名中的每一個單詞的第一個字母都要大寫出(除去第一個單詞外)
b. 描述性變量名和過程名:
變量名或過程名的主體使用大小寫混合格式并且盡量完整地描述其目的,另外過程名應(yīng)以動詞開始如:InitNameArray ,CloseDialog
. 對象名的約定:
對象名的前綴約定:
對象類型 前綴
Button btn
Canvas CVS
CheckBox chk
Image img
Label lbl
List lst
Choice chc
Dialog dlg
Event evt
Frame frm
Menu menu
Panel pnl
TextArea txa
TextField txf
. Package 的命名
Package 的名字應(yīng)該都是由一個小寫單詞組成。
. Class 的命名
Class 的名字必須由一個或數(shù)個能表達(dá)該類的意思的大寫字母開頭而其它字母都小寫的單詞或縮寫組成,這樣能使這個 Class 的名稱能更容易被理解。
. Class 變量的命名
變量的名字必須用一個小寫字母開頭。后面的單詞用大寫字母開頭。對于類的成員變量,在對其標(biāo)識符命名時,要加上代表member(成員)的前綴m_。例如一個標(biāo)識符為m_dwFlag,則它表示的變量是一個類型為雙字的成員變量,它是代表一個標(biāo)志。
. Static Final 變量的命名
Static Final 變量的名字應(yīng)該都大寫,并且指出完整含義。
. 參數(shù)的命名
參數(shù)的名字必須和變量的命名規(guī)范一致。
. 數(shù)組的命名
數(shù)組應(yīng)該總是用下面的方式來命名:
byte[] buffer;
而不是:
byte buffer[];
. 方法的參數(shù)
使用有意義的參數(shù)命名,如果可能的話,使用和要賦值的字段一樣的名字:
SetCounter(int size)
{
this.size = size;
}
. 神秘的數(shù)
首先要說什么是神秘的數(shù)。我們在程序里經(jīng)常會用到一些量,它是有特定的含義的。例如,現(xiàn)在我們寫一個薪金統(tǒng)計程序,公司員工有50人,我們在程序里就會用50這個數(shù)去進(jìn)行各種各樣的運(yùn)算。在這里,50就是"神秘的數(shù)"。為什么稱它為神秘呢?因為別的程序員在程序里看到50這個數(shù),不知道它的含義,只能靠猜了。
在程序里出現(xiàn)"神秘的數(shù)"會降低程序的可讀性,應(yīng)該盡量避免。避免的方法是把神秘的數(shù)定義為一個常量。注意這個常量的命名應(yīng)該能表達(dá)該數(shù)的意義,并且應(yīng)該全部大寫,以與對應(yīng)于變量的標(biāo)識符區(qū)別開來。例如上面50這個數(shù),我們可以定義為一個名為NUMOFEMPLOYEES的常量來代替。這樣,別的程序員在讀程序的時候就可以容易理解了。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Java代碼書寫規(guī)范的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!