編碼規范
1 前言
為確保系統源程序可讀性,從而增強系統可維護性,java編程人員應具有基本類似的編程風格,茲制定下述Java編程規范,以規范系統Java部分編程。系統繼承的其它資源中的源程序也應按此規范作相應修改。
2 適用范圍
本文檔將作為java編程人員軟件開發的編程格式規范。在項目Java部分的編碼、測試及維護過程中,要求嚴格遵守。
3 命名規范
定義這個規范的目的是讓項目中所有的文檔都看起來像一個人寫的,增加可讀性,減少項目組中因為換人而帶來的損失。
3.1 Package 的命名
Package 的名字應該都是由一個小寫單詞組成。示例:unipost.trans
3.2 Class 的命名
Class 的名字每個單詞必須由大寫字母開頭而其他字母都小寫的單詞組成。示例:FileMng
3.3 Class 成員的命名
變量、方法、屬性:大小寫混排的單詞組成,首字母小寫
示例: functionName、countNum、size
3.4 Static Final 變量的命名
Static Final常量:大寫單詞組成,單詞之間使用“_”連接
示例: MAX_INDEX
3.5 前后台變量名稱
前台變量 fg_變量名
后台變量 bg_變量名
3.6 參數的命名
參數的名字必須和變量的命名規范一致。
3.7 數組的命名
數組應該總是用下面的方式來命名:
byte[] buffer; 而不是: byte buffer[];
3.8 方法的參數
使用有意義的參數命名,如果可能的話,使用和要賦值的屬性一樣的名字:
setCounter(int size) { this.size = size; }
3.9 縮寫
某些通用的縮寫可以使用,如:
temp 可縮寫為 tmp ;
message 可縮寫為 msg ;
3.10 標識符命名中應注意的問題
3.10.1 除局部循環變量外變量名禁止取單個字符
對於變量命名,禁止取單個字符(如i、j、k...),建議除了要有具體含義外,還能表明其變量類型、數據類型等,但i、j、k作局部循環變量是允許的。
說明:變量,尤其是局部變量,如果用單個字符表示,很容易敲錯(如i寫成j),而編譯時又檢查不出來,有可能為了這個小小的錯誤而花費大量的查錯時間。
3.10.2 不用數字定義名字
除非必要,不要用數字或較奇怪的字符來定義標識符。
示例:如下命名,使人產生疑惑。
void set_sls00( BYTE sls );
應改為有意義的單詞命名
void setUdtMsgSls( BYTE sls );
3.10.3 用正確的反義詞組命名
用正確的反義詞組命名具有互斥意義的變量或相反動作的函數等。
說明:下面是一些在軟件中常用的反義詞組。
add / remove begin / end create / destroy insert / delete first / last get / set increment / decrement put / get add / delete lock / unlock open / close min / max old / new start / stop next / previous source / target show / hide send / receive source / destination cut / paste up / down 示例: int minSum; int maxSum; int addUser( BYTE *userName ); int deleteUser( BYTE *userName );
3.10.4 避免使用
應避免使用_EXAMPLE_TEST_之類以下划線開始和結尾的定義。
4 樣式
4.1 Java 文件樣式
所有的 Java(*.java) 文件都必須遵守如下的樣式規則
4.1.1 版權信息
版權信息必須在 java 文件的開頭,示例:
/* * ------------------------------------------------------- * Copyright (c) 2018, 小a玖拾柒 * All rights reserved. * * FileName:filename.java * Description:簡要描述本文件的內容 * History: * Date Author Desc * ------------------------------------------------------- */
4.1.2 Package/Imports
package 行要在 import 行之前,import 中標准的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則建議用 * 來處理。
package com.nantian; import java.io.*; import java.util.Observable; import translator; 這里 java.io.* 使用來代替InputStream and OutputStream 的。
4.2 Class的樣式
4.2.1 Class的定義
包含了在不同的行的 extends 和 implements
public class CounterSet extends Observable implements Cloneable
4.2.2 Class Fields
類的成員變量:
/** * Packet counters */ protected int[] packets;
public 的成員變量一定要有注釋而且必須生成文檔(JavaDoc)。
proceted、private和 package 定義的成員變量如果名字含義明確的話,可以沒有注釋。
4.2.3 構造函數
構造函數,它應該用遞增的方式寫(比如:參數多的寫在后面)。示例:
public CounterSet(int size) { this.size = size; } public CounterSet(int size,String name) { this.size = size; this.name = name; }
4.2.4 克隆方法
如果這個類是可以被克隆的:
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()); } }
4.2.5 類成員變量和方法的編寫順序
建議編寫順序為:
public protected private
final static transient
4.2.6 main 方法
如果main(String[]) 方法已經定義了, 那么它應該寫在類的底部。
4.3 代碼樣式
代碼應該用 unix 的格式,而不是 windows 的(比如:回車變成回車+換行)
5 注釋
5.1 一般情況下
源程序有效注釋量必須在20%以上。
說明:注釋的原則是有助於對程序的閱讀理解,在該加的地方都加了,注釋不宜太多也不能太少,注釋語言必須准確、易懂、簡潔。
5.2 常規注釋標記說明
注釋起始為“/**…*/”,注釋文檔的第一條為總結性語句,可在注釋文檔中使用HTML的標簽語句,但要杜絕使用“HL”“HR”標簽。注釋全部采用中文,並依據以下標記規范進行書寫。
5.2.1 @since
@since 文字:可生成一個“自從”條目,通過其中的“文字”,可說明一項特性是“自從”哪個版本開始引入的。
5.2.2 @deprecated
@deprecated 文字:可增加一條注釋,指定特定的類、方法或變量不應繼續使用,在這里,deprecated是“不贊成”,“不推薦”之意。利用其中的“文字”,可向用戶推薦另一種方法來達到同樣的目的。如:
/** ... @deprecated 使用setVisible */
5.2.3 @see
@see 鏈接:增加一個超鏈接。
5.2.3.1 若指向類、方法或變量名
可在@see后直接寫上類、方法或變量名,書寫方法時可省略包、類名,特性會默認為當前包或類。注意:類、方法、變量名間使用“#”分隔。如:
/** ... @see packeg.class#readInt(String) */
5.2.3.2 若指向一個具體的URL,則直接書寫HTML標簽錨。如:
/** ... @see <a href=”www.java.com”>The Java Site</a> (HTML標簽的書寫,參見關於HTML的書籍) */
5.2.3.3 若指向到“seealso(參考)”小節顯示出來,使用“”””(雙引號)。如:
/** ... @see “java1.2 volume2” 注:可書寫多個標記,但必須放在一起,以下全部一樣。 */
5.2.4 @link
@link:可在注釋中建立特殊的超鏈接,令其指向其他類或方法,標記規則同@see。
5.3 類和接口注釋說明
類注釋必須置於任何一個import語句后面,同時位於class定義的前面。
@author 名字:建立一個“作者”條目。
@version 文字:建立一個“版本”條目。
5.4 方法注釋說明
緊靠在每條方法的前面,必須有一個它所描述的那個方法的簽名。
@param 變量描述:給“parameters”(參數)小節增添一個條目。
@return 描述:增添一個“returns”(返回值)小節。
@throws 類描述:為方法的“throws”(產生違例)小節增添一個條目。
如:
/** 將一個雙精度數格式化成一個字串 @param x 要格式化的數字 @return 格式化成的字串 @throws 如參數錯誤,產生IllegalArgumentException(非法參數違例) */.
6 書寫格式規范
6.1 代碼編寫規范
6.1.1 縮進
縮進應該是每行4個空格,在使用不同的源代碼管理工具時Tab字符將因為用戶設置的不同而擴展為不同的寬度.
如果你使用 UltrEdit 作為你的 Java 源代碼編輯器的話,你可以通過如下操作來禁止保存Tab字符, 方法是通過 UltrEdit中先設定 Tab 使用的長度室4個空格,然后用 Format|Tabs to Spaces 菜單將 Tab 轉換為空格。
case語句下的情況處理語句也要遵從語句縮進要求。
6.1.2 頁寬
頁寬應該設置為80字符. 源代碼一般不會超過這個寬度, 並導致無法完整顯示, 但這一設置也可以靈活調整. 在任何情況下, 超長的語句應該在一個逗號或者一個操作符后折行. 一條語句折行后, 應該比原來的語句再縮進4個字符。
示例:
permCountMsg.Head.Len = NO7_TO_STAT_PERM_COUNT_LEN
+ STAT_SIZE_PER_FRAM * sizeof( _UL );
actTaskTable[FrameID * STAT_TASK_CHECK_NUMBER + index].Occupied
= statPole[index].occupied;
6.1.3 空行
相對獨立的程序塊之間、變量說明之后必須加空行。
示例:如下例子不符合規范。
if ( !validNill(nill)) { ... // program code } repssnInd = sendData[index].repssn_index; repssnNill = sendData[index].nill; 應如下書寫 if (!validNill(nill)) { ... // program code } repssnInd = sendData[index].repssn_index; repssnNill = sendData[index].nill;
6.1.4 空格的使用
在兩個以上的關鍵字、變量、常量進行對等操作時,它們之間的操作符之前、之后或者前后要加空格;進行非對等操作時,如果是關系密切的立即操作符(如->),后不應加空格。
說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。
左括號和后一個字符之間不應該出現空格, 同樣, 右括號和前一個字符之間也不應該出現空格. 下面的例子說明括號和空格的錯誤及正確使用:
CallProc( AParameter ); // 錯誤
CallProc(AParameter); // 正確
6.1.5 {}的用法
程序塊的分界符(如大括號‘{’和‘}’)應各獨占一行並且位於同一列,同時與引用它們的語句左對齊。在函數體的開始、類的定義、結構的定義、枚舉的定義以及if、for、do、while、switch、case語句中的程序都要采用如上的縮進方式。
示例:如下例子不符合規范。
for (...) { ... // program code } if (...) { ... // program code } void exampleFunction( void ) { ... // program code }
應如下書寫。
for (...) { ... // program code } if (...) { ... // program code } void exampleFunction( void ) { ... // program code }
6.1.6 if等語句寫法
if、for、do、while、case、switch、default、try、catch等語句自占一行,“{”必須回行編寫,且if、for、do、while等語句的執行語句部分必須用{}括起回行編寫,若有執行語句只有一條,{}可缺省。
示例:如下例子不符合規范。
if (pUserCR == NULL) return;
應如下書寫:
if (pUserCR == NULL)
{
return;
}
6.1.7 循環、判斷等語句
循環、判斷等語句中若有較長的表達式或語句,則要進行適當的划分,長表達式要在低優先級操作符處划分新行,操作符放在新行之首。
示例:
if ((taskNo < maxActTaskNumber) && (timeNo < minActTimeNumber) && (n7StatItemValid(statItem))) { ... // program code } for (i = 0, j = 0; (i < bufferKeyword[WordIndex].word_length) && (j < newKeyword.word_length); i++, j++) { ... // program code } for (i = 0, j = 0; (i < firstWordLength) && (j < secondWordLength); i++, j++) { ... // program code }
6.1.8 參數划分
若方法中的參數較長,則要進行適當的划分。
示例:
n7StatStrCompare((BYTE *) & statObject, (BYTE *) & (actTaskTable[taskno].statObject), sizeof (_STAT_OBJECT)); n7StatFlashActDuration( statItem, frameID *STAT_TASK_CHECK_NUMBER + index, statObject );
6.1.9 一行只寫一條語句
不允許把多個短語句寫在一行中,即一行只寫一條語句。
示例:如下例子不符合規范。
rect.length = 0; rect.width = 0;
應如下書寫
rect.length = 0;
rect.width = 0;
6.2 變量編寫規范
6.2.1 公共變量
6.2.1.1 去掉沒必要的公共變量。
說明:公共變量是增大模塊間耦合的原因之一,故應減少沒必要的公共變量以降低模塊間的耦合度。
6.2.1.2 仔細定義並明確公共變量的含義、作用、取值范圍及公共變量間的關系。
說明:在對變量聲明的同時,應對其含義、作用及取值范圍進行注釋說明,同時若有必要還應說明與其它變量的關系。
6.2.1.3 當向公共變量傳遞數據時,要十分小心,防止賦與不合理的值或越界等現象發生。
說明:對公共變量賦值時,若有必要應進行合法性檢查,以提高代碼的可靠性、穩定性。
6.2.2 局部變量
6.2.2.1 防止局部變量與公共變量同名。
說明:若使用了較好的命名規則,那么此問題可自動消除。
6.3 程序編寫規范
6.3.1 exit()
exit 除了在 main 中可以被調用外,其他的地方不應該調用。因為這樣做不給任何代碼機會來截獲退出。一個類似后台服務的程序不應該因為某一個庫模塊決定了要退出就退出。
6.3.2 異常
申明的錯誤應該拋出一個RuntimeException或者派生的異常。申明的錯誤主要指前提條件違例、處理流程違例的情況。對於功能性的分支建議采用返回值的方式。
異常建議根據模塊結構,采用逐級處理的方式,並打印(或者記錄在日志中)。同一模塊層次的異常,按功能可由某一模塊集中處理。
6.3.3 垃圾收集
JAVA使用成熟的后台垃圾收集技術來代替引用計數。但是這樣會導致一個問題:你必須在使用完對象的實例以后進行清場工作(將對象置為NULL后,引用計數自動-1)。
6.3.4 final 類
絕對不要因為性能的原因將類定義為 final 的(除非程序的框架要求)
如果一個類還沒有准備好被繼承,最好在注釋中注明,而不要將它定義為 final 的。這是因為沒有人可以保證會不會由於什么原因需要繼承。
6.3.5 訪問類的成員變量
大部分的類成員變量應該定義為 private 的來防止繼承類使用他們。
7 編程技巧
7.1 一般性原則
7.1.1 檢查所有參數輸入的有效性。
7.1.2 檢查參數輸入
檢查所有非參數輸入的有效性,如數據文件、公共變量等。
說明:輸入主要有兩種:一種是參數輸入;另一種是全局變量、數據文件的輸入,即非參數輸入。在使用輸入之前,應進行必要的檢查。
7.1.3 類名應准確描述類的功能。
7.1.4 避免強制返回值類型
除非必要,最好不要把與返回值類型不同的變量,以編譯系統默認的轉換方式或強制的轉換方式作為返回值返回。
7.1.5 讓調用點顯得易懂、容易理解。
7.1.6 減少數據類型轉換
在填寫參數時,應盡量減少沒有必要的默認數據類型轉換或強制數據類型轉換。
說明:因為數據類型轉換或多或少存在危險。
7.1.7 防止程序中的垃圾代碼。
說明:程序中的垃圾代碼不僅占用額外的空間,而且還常常影響程序的功能與性能,很可能給程序的測試、維護等造成不必要的麻煩。
7.1.8 減少遞歸調用。
說明:遞歸調用影響程序的可理解性;遞歸調用一般都占用較多的系統資源(如棧空間);遞歸調用對程序的測試有一定影響。故除非為某些算法或功能的實現方便,應減少沒必要的遞歸調用。
7.1.9 使用數據流圖
仔細分析模塊的功能及性能需求,並進一步細分,同時若有必要畫出有關數據流圖。
說明:根據模塊的功能圖或/及數據流圖映射出結構是常用方法之一。
7.1.10 避免使用BOOL參數。
說明:原因有二,其一是BOOL參數值無意義,TURE/FALSE的含義是非常模糊的,在調用時很難知道該參數到底傳達的是什么意思;其二是BOOL參數值不利於擴充。還有NULL也是一個無意義的單詞。
7.2 開發過程中的技巧
7.2.1 byte 數組轉換到 characters
為了將 byte 數組轉換到 characters,你可以這么做:
"Hello world!".getBytes();
7.2.2 Utility 類
Utility 類(僅僅提供方法的類)應該被申明為抽象的來防止被繼承或被初始化。
7.2.3 初始化數組
下面的代碼是一種很好的初始化數組的方法:
objectArguments = new Object[] { arguments };
7.2.4 枚舉類型
JAVA 對枚舉的支持不好,但是下面的代碼是一種很有用的模板:
class Colour { public static final Colour BLACK = new Colour(0, 0, 0); public static final Colour RED = new Colour(0xFF, 0, 0); public static final Colour GREEN = new Colour(0, 0xFF, 0); public static final Colour BLUE = new Colour(0, 0, 0xFF); public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF); }
這種技術實現了RED, GREEN, BLUE 等可以象其他語言的枚舉類型一樣使用的常量。 他們可以用 == 操作符來比較。
但是這樣使用有一個缺陷:如果一個用戶用這樣的方法來創建顏色 BLACK
new Colour(0,0,0) ,那么這就是另外一個對象。==操作符就會產生錯誤。她的 equal() 方法仍然有效。由於這個原因,這個技術的缺陷最好注明在文檔中,或者只在自己的包中使用。
7.2.5 Swing
避免使用 AWT 組件
混合使用 AWT 和 Swing 組件
如果要將 AWT 組件和 Swing 組件混合起來使用的話,請小心使用。實際上,盡量不要將他們混合起來使用。
滾動的 AWT 組件
AWT 組件絕對不要用 JscrollPane 類來實現滾動。滾動 AWT 組件的時候一定要用 AWT ScrollPane 組件來實現。
避免在 InternalFrame 組件中使用 AWT 組件
盡量不要這么做,要不然會出現不可預料的后果。
7.2.6 Z-Order 問題
AWT 組件總是顯示在 Swing 組件之上。當使用包含 AWT 組件的 POP-UP 菜單的時候要小心,盡量不要這樣使用。
7.2.7 不必要的對象構造
不要在循環中構造和釋放對象
7.2.8 synchronized 關鍵字
避免太多的使用 synchronized 關鍵字
避免不必要的使用關鍵字synchronized,應該在必要的時候再使用它,這是一個避免死鎖的好方法。
Borland Jbulider 不喜歡 synchronized 這個關鍵字,如果你的斷點設在這些關鍵字的作用域內的話,調試的時候你會發現的斷點會到處亂跳,讓你不知所措。除非必須,盡量不要使用。
7.3 程序效率
7.3.1 注意代碼的效率
編程時要經常注意代碼的效率。
說明:代碼效率分為全局效率、局部效率、時間效率及空間效率。全局效率是站在整個系統的角度上的系統效率;局部效率是站在模塊或函數角度上的效率;時間效率是程序處理輸入任務所需的時間長短;空間效率是程序所需內存空間,如機器代碼空間大小、數據空間大小、棧空間大小等。
7.3.2 提高代碼效率
在保證系統的正確性、穩定性、可讀性及可測性的前提下,提高代碼效率。
說明:不能一味地追求代碼效率,而對軟件的正確性、穩定性、可讀性及可測性造成影響。
7.3.3 局部效率應為全局效率服務
局部效率應為全局效率服務,不能因為提高局部效率而對全局效率造成影響。
7.3.4 循環體內工作量最小化。
說明:應仔細考慮循環體內的語句是否可以放在循環體之外,使循環體內工作量最小,從而提高程序的時間效率。
示例:如下代碼效率不高。
for (i = 0; i < MAX_ADD_NUMBER; i++) { sum += i; BackSum = sum; /* backup sum */ } 語句“BackSum = sum;”完全可以放在for語句之后,如下。 for (ind = 0; ind < MAX_ADD_NUMBER; ind++) { sum += i; } BackSum = sum; /* backup sum */
7.3.5 仔細分析有關算法,並進行優化。
7.3.6 改進輸入方式
仔細考查、分析系統及模塊處理輸入(如事務、消息等)的方式,並加以改進。
7.3.7 提高調用不頻繁的代碼效率要慎重
不應花過多的時間拼命地提高調用不很頻繁的代碼效率。
說明:對代碼優化可提高效率,但若考慮不周很有可能引起嚴重后果。
7.3.8 提高空間效率
在保證程序質量的前提下,通過壓縮代碼量、去掉不必要代碼以及減少不必要的局部和全局變量,來提高空間效率。
說明:這種方式對提高空間效率可起到一定作用,但往往不能解決根本問題。
7.3.9 循環的位置
在多重循環中,應將最忙的循環放在最內層。
說明:減少CPU切入循環層的次數。
示例:如下代碼效率不高。
for (row = 0; row < 100; row++) { for (col = 0; col < 5; col++) { sum += a[row][col]; } }
可以改為如下方式,以提高效率。
for (col = 0; col < 5; col++) { for (row = 0; row < 100; row++) { sum += a[row][col]; } }
7.3.10 盡量減少循環嵌套層次。
7.3.11 避免循環體內含判斷語句
避免循環體內含判斷語句,應將循環語句置於判斷語句的代碼塊之中。
說明:目的是減少判斷次數。循環體中的判斷語句是否可以移到循環體外,要視程序的具體情況而言,一般情況,與循環變量無關的判斷語句可以移到循環體外,而有關的則不可以。
示例:如下代碼效率稍低。
for (i = 0; i < MAX_RECT_NUMBER; i++) { if (DataType == RECT_AREA) { AreaSum += RectArea[i]; } else { RectLengthSum += Rect[i].length; RectWidthSum += Rect[i].width; } }
因為判斷語句與循環變量無關,故可如下改進,以減少判斷次數。
if (DataType == RECT_AREA) { for (i = 0; i < MAX_RECT_NUMBER; i++) { AreaSum += RectArea[i]; } } else { for (i = 0; i < MAX_RECT_NUMBER; i++) { RectLengthSum += Rect[i].length; RectWidthSum += rect[i].width; } }
7.3.12 不要一味追求緊湊的代碼。
說明:因為緊湊的代碼並不代表高效的機器碼
8 性能
在寫代碼的時候,從頭至尾都應該考慮性能問題。這不是說時間都應該浪費在優化代碼上,而是我們時刻應該提醒自己要注意代碼的效率。比如:如果沒有時間來實現一個高效的算法,那么我們應該在文檔中記錄下來,以便在以后有空的時候再來實現她。
不是所有的人都同意在寫代碼的時候應該優化性能這個觀點的,他們認為性能優化的問題應該在項目的后期再去考慮,也就是在程序的輪廓已經實現了以后。
8.1 可移植性
為了保證系統的可移植性,需要注意以下幾點:
8.1.1 換行
如果需要換行的話,盡量用 println 來代替在字符串中使用"\n"。
你不要這樣:
System.out.print("Hello,world!\n");
要這樣:
System.out.println("Hello,world!");
或者你構造一個帶換行符的字符串,至少要象這樣:
String newline = System.getProperty("line.separator");
System.out.print ("Hello world" + newline);
8.1.2 PrintStream
PrintStream已經被不贊成(deprecated)使用,用PrintWrite來代替。
8.2 可測性
8.2.1 調測
在同一項目組或產品組內,要有一套統一的為集成測試與系統聯調准備的調測開關及相應打印方法,並且要有詳細的說明。
說明:本規則是針對項目組或產品組的。
8.2.2 調測信息串格式
在同一項目組或產品組內,調測打印出的信息串的格式要有統一的形式。信息串中至少要有所在模塊名(或源文件名)。
說明:統一的調測信息格式便於集成測試。
8.2.3 在編程中注意單元測試
編程的同時要為單元測試選擇恰當的測試點,並仔細構造測試代碼、測試用例,同時給出明確的注釋說明。測試代碼部分應作為(模塊中的)一個子模塊,以方便測試代碼在模塊中的安裝與拆卸(通過調測開關)。
說明:為單元測試而准備。
8.2.4 測試准備
在進行集成測試/系統聯調之前,要構造好測試環境、測試項目及測試用例,同時仔細分析並優化測試用例,以提高測試效率。
說明:好的測試用例應盡可能模擬出程序所遇到的邊界值、各種復雜環境及一些極端情況等。
8.2.5 測試手段
在軟件系統中設置與取消有關測試手段,不能對軟件實現的功能等產生影響。
說明:即有測試代碼的軟件和關掉測試代碼的軟件,在功能行為上應一致。
8.2.6 調測開關
用調測開關來切換軟件的DEBUG版和正式版,而不要同時存在正式版本和DEBUG版本的不同源文件,以減少維護的難度。
8.2.7 調試與測試
在編寫代碼之前,應預先設計好程序調試與測試的方法和手段,並設計好各種調測開關及相應測試代碼如打印函數等。
說明:程序的調試與測試是軟件生存周期中很重要的一個階段,如何對軟件進行較全面、高率的測試並盡可能地找出軟件中的錯誤就成為很關鍵的問題。因此在編寫源代碼之前,除了要有一套比較完善的測試計划外,還應設計出一系列代碼測試手段,為單元測試、集成測試及系統聯調提供方便。
8.2.8 調測開關的級別和類型
調測開關應分為不同級別和類型。
說明:調測開關的設置及分類應從以下幾方面考慮:針對模塊或系統某部分代碼的調測;針對模塊或系統某功能的調測;出於某種其它目的,如對性能、容量等的測試。這樣做便於軟件功能的調測,並且便於模塊的單元測試、系統聯調等。
8.2.9 編寫防錯程序
編寫防錯程序,然后在處理錯誤之后可用斷言宣布發生錯誤。
示例:假如某模塊收到通信鏈路上的消息,則應對消息的合法性進行檢查,若消息類別不是通信協議中規定的,則應進行出錯處理
9 質量保證
9.1 代碼質量保證優先原則
(1)正確性,指程序要實現設計要求的功能。
(2)穩定性、安全性,指程序穩定、可靠、安全。
(3)可測試性,指程序要具有良好的可測試性。
(4)規范/可讀性,指程序書寫風格、命名規則等要符合規范。
(5)全局效率,指軟件系統的整體效率。
(6)局部效率,指某個模塊/子模塊/函數的本身效率。
(7)個人表達方式/個人方便性,指個人編程習慣。
9.2 打開的文件要關閉
程序中申請的(為打開文件而使用的)文件句柄,在過程/函數退出之前要關閉。
9.3 一致性檢查
系統運行之初,要對加載到系統中的數據進行一致性檢查。
說明:使用不一致的數據,容易使系統進入混亂狀態和不可知狀態。
9.4 switch語句必須有default分支。
9.5 其他質量問題
使用第三方提供的軟件開發工具包或控件時,要注意以下幾點:
(1)充分了解應用接口、使用環境及使用時注意事項。
(2)不能過分相信其正確性。
(3)除非必要,不要使用不熟悉的第三方工具包與控件。
說明:使用工具包與控件,可加快程序開發速度,節省時間,但使用之前一定對它有較充分的了解,同時第三方工具包與控件也有可能存在問題。
資源文件(多語言版本支持),如果資源是對語言敏感的,應讓該資源與源代碼文件脫離
10 代碼編輯、編譯、審查
10.1 統一編譯環境
在產品軟件(項目組)中,要統一編譯環境,相同的JDK版本
10.2 代碼走讀及評審
通過代碼走讀及審查方式對代碼進行檢查。
(1)代碼走讀主要是對程序的編程風格如注釋、命名等以及編程時易出錯的內容進行檢查,可由開發人員自己或開發人員交叉的方式進行。
(2)代碼審查主要是對程序實現的功能及程序的穩定性、安全性、可靠性等進行檢查及評審,可通過自審、交叉審核或指定部門抽查等方式進行。
10.3 QA代碼抽查
測試部測試產品之前,QA應對代碼進行抽查及評審。
10.4 軟件系統目錄
合理地設計軟件系統目錄,方便開發人員使用。
說明:方便、合理的軟件系統目錄,可提高工作效率。目錄構造的原則是方便有關源程序的存儲、查詢、編譯、鏈接等工作,同時目錄中還應具有工作目錄----所有的編譯、鏈接等工作應在此目錄中進行,工具目錄----有關文件編輯器、文件查找等工具可存放在此目錄中。