团队开发之:代码规范说明
1.1? 目的
今天人們越來越明白軟件設計更多地是一種工程,而不是一種個人藝術。由于大型產品的開發通常由很多的人協同作戰,如果不統一編程規范,最終合到一起的程序,其可讀性將較差,這不僅給代碼的理解帶來障礙,增加維護階段的工作量,同時不規范的代碼隱含錯誤的可能性也比較大。
為了提高代碼的可讀性和質量,本文檔針對Java編碼規范詳細設計說明。
1.2?范圍
?????? 本Java代碼規范以SUN的標準Java代碼規范為基礎,為適應我們公司的實際需要,可能會做一些修改。本文檔中沒有說明的地方,請參看SUN?Java標準代碼規范。如果兩邊有沖突,以SUN?Java標準為準。
?????? 供開發人員進行閱讀
1.3? 術語
1.4?參考文檔
?
2.標示符命名規范
2.1?原則
l?統一
統一是指,對于同一個概念,在程序中用同一種表示方法,比如對于供應商,既可以用supplier,也可以用provider,但是我們只能選定一個使用,至少在一個Java項目中保持統一。統一是作為重要的,如果對同一概念有不同的表示方法,會使代碼混亂難以理解。即使不能取得好的名稱,但是只要統一,閱讀起來也不會太困難,因為閱讀者只要理解一次。
l?達意
達意是指,標識符能準確的表達出它所代表的意義,比如: newSupplier, OrderPaymentGatewayService等;而 supplier1, service2,idtts等則不是好的命名方式。準確有兩成含義,一是正確,而是豐富。如果給一個代表供應商的變量起名是 order,顯然沒有正確表達。同樣的,supplier1, 遠沒有targetSupplier意義豐富。
l?簡潔
簡潔是指,在統一和達意的前提下,用盡量少的標識符。如果不能達意,寧愿不要簡潔。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered太長, transferedTargetSupplierOrderName則較好,但是transTgtSplOrdNm就不好了。省略元音的縮寫方式不要使用,我們的英語往往還沒有好到看得懂奇怪的縮寫。
l?駱駝法則
Java中,除了包名,靜態常量等特殊情況,大部分情況下標識符使用駱駝法則,即單詞之間不使用特殊符號分割,而是通過首字母大寫來分割。比如: supplierName, addNewContract,而不是 supplier_name, add_new_contract。
l?英文
盡量使用通俗易懂的英文單詞,如果不會可以向隊友求助,實在不行則使用漢語拼音,避免拼音與英文混用。比如表示歸檔,用archive比較好。
2.2?包名規范
l? 使用小寫和數字組合,不要出現其他字符和符號。例如:com.aps.alg
2.3?類名命名規范
l? 首字母大寫
l? 后綴命名
類名往往用不同的后綴表達額外的意思,如下表:
| 后綴名 | 意義 | 舉例 |
| EJB | 表示這個類為EJB類 | LCIssueInfoManagerEJB |
| Service | 表明這個類是個服務類,里面包含了給其他類提同業務服務的方法 | PaymentOrderService |
| Impl | 這個類是一個實現類,而不是接口 | PaymentOrderServiceImpl |
| Inter | 這個類是一個接口 | LifeCycleInter |
| Dao | 這個類封裝了數據訪問方法 | PaymentOrderDao |
| Action | 直接處理頁面請求,管理頁面邏輯了類 | UpdateOrderListAction |
| Listener | 響應某種事件的類 | PaymentSuccessListener |
| Event | 這個類代表了某種事件 | PaymentSuccessEvent |
| Servlet | 一個Servlet | PaymentCallbackServlet |
| Factory | 生成某種對象工廠的類 | PaymentOrderFactory |
| Adapter | 用來連接某種以前不被支持的對象的類 | DatabaseLogAdapter |
| Job | 某種按時間運行的任務 | PaymentOrderCancelJob |
| Wrapper | 這是一個包裝類,為了給某個類提供沒有的能力 | SelectableOrderListWrapper |
| Bean | 這是一個POJO | MenuStateBean |
2.4?方法名命名規范
l? 首字母小寫,動詞在前
動詞前綴往往表達特定的含義,如下表:
| 前綴名 | 意義 | 舉例 |
| create | 創建 | createOrder() |
| delete | 刪除 | deleteOrder() |
| add | 創建,暗示新創建的對象屬于某個集合 | addPaidOrder() |
| remove | 刪除 | removeOrder() |
| init或則initialize | 初始化,暗示會做些諸如獲取資源等特殊動作 | initializeObjectPool |
| destroy | 銷毀,暗示會做些諸如釋放資源的特殊動作 | destroyObjectPool |
| open | 打開 | openConnection() |
| close | 關閉 | closeConnection()< |
| read | 讀取 | readUserName() |
| write | 寫入 | writeUserName() |
| get | 獲得 | getName() |
| set | 設置 | setName() |
| prepare | 準備 | prepareOrderList() |
| copy | 復制 | copyCustomerList() |
| modity | 修改 | modifyActualTotalAmount() |
| calculate | 數值計算 | calculateCommission() |
| do | 執行某個過程或流程 | doOrderCancelJob() |
| dispatch | 判斷程序流程轉向 | dispatchUserRequest() |
| start | 開始 | startOrderProcessing() |
| stop | 結束 | stopOrderProcessing() |
| send | 發送某個消息或事件 | sendOrderPaidMessage() |
| receive | 接受消息或時間 | receiveOrderPaidMessgae() |
| respond | 響應用戶動作 | responseOrderListItemClicked() |
| find | 查找對象 | findNewSupplier() |
| update | 更新對象 | updateCommission() |
2.5?變量命名規范
l? 靜態常量:全大寫用下劃線分割
例如:
public static find String ORDER_PAID_EVENT =“ORDER_PAID_EVENT”;
l? 枚舉:全大寫,用下劃線分割
例如:
public enum Events {
ORDER_PAID,
ORDER_CREATED
}
l? 其他:首字母小寫,駱駝法則
例如:
public StringorderName;
?
l? 局部變量: 參數和局部變量名首字母小寫,駱駝法則
盡量不要和域沖突,盡量表達這個變量在方法中的意義。
3.排版風格
規則一:程序塊采用縮進風格編寫,縮進為4個空格位。排版不混合使用空格和TAB鍵。
?
規則二:在兩個以上的關鍵字、變量、常量進行對等操作時,它們之間的操作符之前、之后或者前后要加空格;進行非對等操作時,如果是關系密切的立即操作符,后不應加空格。
(1)??逗號、分號只在后面加空格,例如:
call(a,b, c);
(2)??比較操作符, 賦值操作符"="、 "+=",算術操作符"+"、"%",邏輯操作符"&&"、"&",位域操作符"<<"、"^"等雙目操作符的前后加空格
if(currentTime>= MAX_TIME_VALUE)
a = b + c;
a*= 2;
a= b ^ 2;
(3)??"!"、"~"、"++"、"--"等單目操作符前后不加空格
flag= !bIsEmpty; // 非操作"!"與內容之間
i++;// "++","--"與內容之間
(4)??"."前后不加空格
p.id = pId; // "."前后不加空格
(5) if、for、while、switch等與后面的括號間應加空格,使if等關鍵字更為突出、明顯。
if(a >= b && c > d)
規則三:函數體的開始,類的定義,結構的定義,if、for、do、while、switch及case語句中的程序都應采用縮進方式
不符合規范:
for(...)
{
??? ... // program code
}
?
if(...) {
??? ... // program code
??? }
?
voidexample_fun( void ){
??? ... // program code
??? }
應如下書寫:
for(...) {
??? ... // program code
}
?
if(...) {
??? ... // program code
}
?
voidexample_fun( void ){
??? ... // program code
}
規則四:功能相對獨立的程序塊之間或for、if、do、while、switch等語句前后應加一空行
不符合規范:
if(!valid_ni(ni))
{
??? ... // program code
}
repssn_ind= ssn_data[index].repssn_index;
repssn_ni? = ssn_data[index].ni;
?
應如下書寫:
if(!valid_ni(ni))
{
??? ... // program code
}
?
repssn_ind= ssn_data[index].repssn_index;
repssn_ni? = ssn_data[index].ni;
規則五:if、while、for、case、default、do等語句自占一行。
不符合規范:
If(NULL == pUserCR) return;
應如下書寫:
If(NULL == pUserCR)
{
????? ?????????? return;
}
規則六:若語句較長(多于80字符),可分成多行寫,劃分出的新行要進行適應的縮進,使排版整齊,語句可讀。
?
規則七:一行最多寫一條語句。
不符合規范:
rect.length= 0 ; rect.width = 0 ;
rect.length= width = 0;
應書寫成:
rect.length= 0 ;
rect.width= 0 ;
規則八:類先成員變量,后內部函數接口;關鍵字public、protected、private依次按照順序排版。
例如:
class A
{
public? int iNum;
?private int? iCode;
?private float fNum;
???…
publicvoid Func1(void);
publicvoid Func2(void);
private void Func3(void);
}
規則九:編寫條件的時候采用“常量==變量”格式
4.注釋規則
規則一:文件級注釋
/**
?*
?*<li>模塊名 : LoginController<br />
?*<li>文件名 : LoginController.java<br />
?*<li>創建時間 : 2015年12月25日<br />
?*<li>實現功能 : <br />????????????????????? (說明:該位置需要換行的時候結尾加上<br />,以便生成的文檔格式友好)
?*<li>作者 : changyong<br />
?*<li>版本 : v0.0.1<br />
?*<li>----------------------------------------------------------<br />
?*<li>修改記錄:<br />
?*<li>日期版本修改人修改內容<br />
?*<li>2015年12月25日 v0.0.1 changyong創建<br />(說明:該位置需要換行的時候結尾加上<br />,以便生成的文檔格式友好)
?*/
?
注:需記錄文件內容,讓人看注釋就可以知道文件的大致內容;修改記錄重點節點記錄即可。
?
規則二:函數級注釋
??? /**
?? ?*
?? ?*功能: <br />
?? ?*? 注釋測試使用??????????????????? (說明:該位置需要換行的時候結尾加上<br />,最后一個由于下行開始加了,這里不用加,以便生成的文檔格式友好)
?? ?*<br />----------------------------------------------------------------<br />
?? ?*修改記錄:<br />
?? ?*日期? 版本修改人修改內容<br />
?? ?*2015年12月25日 v0.0.1 changyong創建??????????????? (說明:該位置需要換行的時候結尾加上<br />,最后一個由于下行開始加了,這里不用加,以便生成的文檔格式友好)
?? ?*<br />----------------------------------------------------------------
?? ?*@param i
?? ?*@return String
?? ?*/
注:重點函數進行記錄說明,讓人看了就知道函數功能,如何使用等信息;修改記錄重點節點記錄即可。
?
規則三:語句及函數內部結構注釋
為了方便閱讀代碼盡可能的多做一些注釋,特別是關鍵點一定要注釋,但是也不要過于冗余盲目的注釋,盡量達到注釋即為大綱的效果。總結
以上是生活随笔為你收集整理的团队开发之:代码规范说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js识别图片二维码解析网址代码
- 下一篇: Golang go-huge-util