Java編程的標準之JAVA編程規範(3)

集合的存取函數

存取函數的主要目的是將訪問封裝到字段,以減小代碼的耦合。集合,如數組和矢量,要比單值複雜,實現起來天然不僅是須要獲取和設置成員函數。特別是由於要對集合進行增減,因此需使用存取成員函數。在集合字段的適當處加入以下存取成員函數:java

成員函數類型程序員

命名約定數據庫

示例編程

集合獲取函數數組

getCollection()函數

getOrderItems()oop

集合設置函數spa

setCollection()命令行

setOrderItems()設計

在集合中插入一個對象

insertObject()

insertOrderItem()

從集合中刪除一個對象

deleteObject()

deleteOrderItem()

生成而且插入一個新對象到集合中

newObject()

newOrderItem()

這種方法的優勢是集合被徹底封裝了,容許你之後用另一個結構,多是鏈表或是 B 樹來取代它。

同時訪問幾個字段

存取成員函數的一個優勢是,它使你能有效地執行業務規則。考慮以下一個有關形狀 (Shape) 的類的層次結構。Shape的每個子類經過 xPosition 和 yPosition 這兩個字段表示位置,而且能夠經過調用成員函數 move(Float xMovement, Float yMovement) 在屏幕上的二維座標下移動。爲達到咱們的目的,圖形在任什麼時候刻都不能夠只在一個座標軸方向上移動,而應同時沿 x 和 y 軸移動(成員函數 move() 的兩個參數中的任何一個參數均可以是 0.0)。 這就意味着 move()成員函數應該是公有的,可是 setXPosition() 和 setYPosition() 應該是私有的,被 move() 成員函數正確調用。

另外一個實現方法是,引入一個能夠同時更新兩個字段的設置成員函數,以下文所示。成員函數 setXPosition() 和setYPosition() 應該仍然是私有的,這樣它們不會被外部類和子類直接調用(要加入一些以下文所示的註釋來講明它們不該被直接調用)。

/** 設定圖形位置 */

protected void setPosition(Float x, Float y)

{

setXPosition(x);

setYPosition(y);

}

/** 設置 x 座標。重要:調用 setPosition(),不是這個成員函數。*/

private void setXPosition(Float x)

{

xPosition = x;

}

/** 設置圖形的 y 座標

  重要:調用 setPosition(),不是這個成員函數。

*/

private void setYPosition(Float y)

{

yPosition = y;

}

存取函數的可見性

儘量地讓字段成爲被保護 (protected) 類型,這樣只有子類能夠訪問它們。僅當一個外部類須要訪問一個字段時,纔將相應的獲取函數或設置函數置爲公有。注意:獲取函數是公有而設置函數是私有的狀況常常發生。

有時須要將設置函數設爲私有以保證某個常量不變。例如,Order 類可能含有一個字段表示 OrderItem 實例的集合,含有另外一個叫 orderTotal 的字段表示整個定單 (order) 的總和。orderTotal 是一個表示訂購項目子類總和的有用字段。惟一能夠更新 orderTotal 值的成員函數是那些處理訂購項目集合的函數。假設那些成員函數都在 Order 中實現,那麼即便getOrderTotal() 極可能是公有,也應設 setOrderTotal() 爲私有。

必定要初始化靜態字段

靜態字段,也叫類字段,應被賦予有效值,由於不能假定類的實例將在一個靜態字段被訪問以前生成。

 

局部變量標準

局部變量是指在一個塊(一般是一個成員函數)內定義的對象或者數據項。一個局部變量的做用範圍是定義它的塊。局部變量的一些重要的程序設計標準集中在:

· 命名約定

· 註釋約定

· 聲明

命名局部變量

通常說來,命名局部變量遵循與命名字段同樣的約定,即便用完整的英文描述符,任何非開頭的單詞的第一個字母要大寫。

可是爲方便起見,對於以下幾個特殊的局部變量類型,這個約定能夠放寬:

· 流

· 循環計數器

· 異常

命名流

當有一個單輸入和/或單輸出流在一個成員函數中被打開、使用和關閉時,一般的約定是對這些流分別採用 in 和 out[GOS96] 來命名。對於既用於輸入又用於輸出的流,採用 inOut 來命名。

一個經常使用的取代這種約定的方法是分別採用 inputStreamoutputStream 和 ioStream 這樣的名字,而不是 inout 和inOut,雖然這與 Sun 公司的建議相抵觸。

命名循環計數器

由於局部變量經常使用做循環計數器,而且它爲 C/C++ 所接受,因此在 Java 編程中,能夠採用 i, j 或 k 做爲循環計數器[GOS96]。 若採用這些名字做爲循環計數器,要始終使用它們。

一個經常使用的取代方法是,使用如 loopCounter 或只是 counter 這樣的名字,可是這種方法的問題是,在一個須要多個計數器的成員函數中,經常發現象 counter1 和 counter2 這樣的名字。 歸納起來講,ijk 做爲計數器時,它們能夠很快被輸入,它們被普遍的接受。

命名異常對象

由於在 Java 代碼中異常處理也很是廣泛,因此字母 e 做爲通常的異常符被普遍地接受 [GOS96]。

聲明和註釋局部變量

在 Java 中聲明和註釋局部變量有幾種約定。這些約定是:

1. 一行代碼只聲明一個局部變量。這與一行代碼應只有一個語句相一致,並使得對每一個變量採用一個行內註釋成爲可能。

2. 用一個行內註釋語句說明局部變量。行內註釋是一種緊接在同一行的命令代碼後,用符號 // 標註出來的單行註釋風格(它也叫「行末註釋」)。應註釋出一個局部變量用於作什麼、在哪裏適用、爲何要用等等,使代碼易讀。

3. 僅將局部變量用於一件事。一旦將一個局部變量用於多個緣由,就明顯下降了它的一致性,使它難於理解。同時也增長了代碼由於局部變量舊值的意外負面影響而產生問題的可能性,這些舊值來源於前面的代碼。的確,局部變量的從新利用須要較少的內存,於是更高效,可是複用局部變量下降了代碼的可維護性,使代碼脆弱。這經常讓因爲沒必要分配更多內存而帶來的小節省變得不值得。

關於聲明的通常註釋

在代碼行間,如在一個 if 語句做用域內,聲明的局部變量對於不熟悉你的代碼的人來講是難於找到的。

一種取代在第一次使用局部變量以前聲明它們的方法是在代碼的前部聲明它們。函數應該簡短,參見(第 2.4.5 節「寫出簡短單獨的命令行」),因此要去代碼頂部判斷局部變量用途的工做並非很糟。

 

成員函數參數標準

有關成員函數參數的重要標準集中在參數應如何命名和說明。參數指成員函數的實參。

命名參數

參數命名遵循與局部變量命名徹底同樣的約定。對於局部變量,名字隱藏是一個問題。

示例:

customer

inventoryItem

photonTorpedo

in

e

一個可行的取代方法,例如 Smalltalk,是採用局部變量的命名約定,但在名字以前加入「a」或「an」。加上「a」或「an」有助於讓參數與局部變量和字段區分開來,避免名字隱藏的問題。這種方法較好。

示例:

aCustomer

anInventoryItem

aPhotonTorpedo

anInputStream

anException

註釋參數

成員函數的參數在採用 javadoc @param 標識的頭文件中註釋。應說明:

1. 參數用來作什麼。須要註釋出參數用來作什麼,以便其餘開發者瞭解使用參數的上下文。

2. 任何約束或前提條件。 若是一個參數的值域不能被成員函數接收,則應讓調用者知道。可能一個成員函數只接收正數,或者字符數小於五的字符串。

3. 示例。若是應傳遞什麼樣的參數不明顯,那麼應該在註釋中給出一個或多個例子。

採用參數類型接口。若合適的話,不要只說明參數類型屬於哪一類,如 Object,而應說明屬於哪一個接口,例如 Runnable。這樣的好處是,這種有賴於環境的方法更具體(Runnable 比 Object 更具體),或者在支持多態性(不堅持一個參數是一個類的層次結構中某個類的實例,而說明它支持一個特定的接口,這意味着它只用多態地適應你的須要便可)上是一個更好的方法。

 

類、接口、包和編譯單元的標準

這一章集中講述類、接口、包和編譯單元的標準和指南。類是一個可讓對象建立的模板。類包含字段和成員函數的聲明。接口是公共標識的定義,包括成員函數和字段。使用接口的類必須支持這些函數和字段。包是一個相關類的集合。最後,編譯單元是聲明類和接口的源碼文件。由於 Java 容許編譯單元放在數據庫中,因此一個單獨的編譯單元可能不與一個源碼文件物理上直接相關。

類的標準

類的一些重要標準基於:

· 命名約定

· 註釋約定

· 聲明約定

· 公共和保護接口

命名類

標準 Java 約定是使用徹底的英文描述符,全部單詞的第一個字母要大寫,而且單詞中大小寫混合。

類名應是單數形式。

示例:

Customer

Employee

Order

OrderItem

FileStream

String

註釋類

如下的信息應寫在文檔註釋中緊靠類的定義的前面:

1. 類的目的。開發者須要瞭解一個類的通常目的,以判斷這個類是否知足他們的需求。養成一個註釋與類有關的任何好東西的習慣,例如:它是不是一個模式的一部分,或是使用它時有什麼要引發注意的限制 [AMB98]。

2. 已知的問題。若是一個類有任何突出的問題,應說明出來,讓其餘的開發者瞭解這個類的缺點/難點。此外,還應註明爲何不解決問題的緣由。注意:若是問題僅僅針對一個成員函數,那麼它應直接與那個成員函數相聯繫。

3. 類的開發/維護歷史。一般要包含一個歷史記錄表,列出日期、類的做者和修改概要。這樣作的目的是讓進行維護的程序員瞭解過去曾對一個類所作的修改,是誰作了什麼樣的修改。

4. 註釋出採用的不變量。不變量是指一套有關實例或類在全部「穩定」時間片內爲「真」的聲明。「穩定時間片」是指在一個成員函數被對象/類調用以前和馬上調用以後的時間 [MEY88]。經過說明一個類的不變量,你讓其餘的開發者瞭解應該如何使用一個類。

5. 並行策略。任何採用 Runnable 接口的類應充分說明它的並行策略。對許多程序員來講,並行編程是一個新的並且複雜的題目,因此須要投入一些額外的時間來確保人們可以讀懂你的東西。說明你的並行策略以及爲何選取這個策略而不是其它策略這很重要。經常使用的並行策略 [LEA97] 包括下面一些內容:同步對象;停滯 (balking) 對象;警惕 (guarded) 對象;版本 (versioned)對象;同步策略控制器;接收器。

類的聲明

一種讓你的類容易被理解的方法是用一致的方式來聲明它們。Java 中經常使用的方法是按以下順序聲明一個類:

公共成員函數

公共字段

被保護成員函數

被保護字段

私有成員函數

私有字段

[LAF97] 指出,構造函數和 finalize() 應該首先列出,多是由於這些將會是另外一個開發者爲了解如何使用一個類而首先查看的成員函數。此外,由於咱們有一個要求將全部字段聲明爲私有的標準,因此聲明順序實際應變爲:

構造函數

finalize()

公共成員函數

被保護成員函數

私有成員函數

私有字段

在每個成員函數分組內,常將函數按照字母表的順序列出來。許多開發者在每一個組內有選擇性地列出了靜態成員函數,而後列出實例成員函數,再在這兩個子分組內按照字母表的順序列出成員函數。這兩種方法均可用,你只需選用一種而且一直用它。

更多遊戲技術方面的問題請訪問遊戲技術網http://www.youxijishu.com

相關文章
相關標籤/搜索