摘要:努力避免硬編碼。一個類的總體行數(shù)盡量控制在行左右不超過一千行。函數(shù)注釋函數(shù)注釋采用,在每個函數(shù)或者過程的前面要有必要的注釋信息,包括函數(shù)或過程名稱功能描述輸入輸出及返回值說明調(diào)用關(guān)系及被調(diào)用關(guān)系說明等。
前言
推薦Google的Java編碼規(guī)范英文版:
http://google-styleguide.googlecode.com/svn/trunk/javaguide.html
雖然這篇文章的英文很簡單,但是最近發(fā)現(xiàn)有人翻譯了這篇文章,所以專門推薦一下:
http://hawstein.com/posts/google-java-style.html
正文一、命名規(guī)范
已經(jīng)被使用的常量,不要重新定義
約定俗成的常量含義,不要重新定義。
努力避免硬編碼。
每個模塊,建議有獨(dú)立的常量類。
方法名都以lowerCamelCase風(fēng)格編寫
類名都以UpperCamelCase風(fēng)格編寫
參數(shù)名以lowerCamelCase風(fēng)格編寫
局部變量名以lowerCamelCase風(fēng)格編寫,比起其它類型的名稱,局部變量名可以有更為寬松的縮寫。
雖然縮寫更寬松,但還是要避免用單字符進(jìn)行命名,除了臨時(shí)變量和循環(huán)變量。
即使局部變量是final和不可改變的,也不應(yīng)該把它示為常量,自然也不能用常量的規(guī)則去命名它。
二、函數(shù)/方法
public 函數(shù)(方法),對象參數(shù) 必須要處理參數(shù)為null的情況,
private 函數(shù),對象參數(shù) 可以不用處理參數(shù)為null的情況(依情況而定)
方法名都以lowerCamelCase 開頭單詞小寫后面駝峰風(fēng)格編寫
方法長度不超過50行
三、嵌套層級不要超過3層。
for,while,if ,switch 等。
方法中條件不成立直接return,不再向下執(zhí)行
如: public int xxx (String userId, String password, String email){ if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(email) ||StringUtils.isEmpty(password)){ return null; } UserEntity ue = EntityProxy.OBJ.get(userId, UserEntity.class); if(ue == null){ return null; } ……... }
避免前套層次過深,建議不超過三層
四、代碼結(jié)構(gòu)
1垂直
以下情況需要使用一個空行:
類內(nèi)連續(xù)的成員之間:字段,構(gòu)造函數(shù),方法,嵌套類,靜態(tài)初始化塊,實(shí)例初始化塊。
例外:兩個連續(xù)字段之間的空行是可選的,用于字段的空行主要用來對字段進(jìn)行邏輯分組。
在函數(shù)體內(nèi),語句的邏輯分組間使用空行。
類內(nèi)的第一個成員前或最后一個成員后的空行是可選的(既不鼓勵也不反對這樣做,視個人喜好而定)。
要滿足本文檔中其他節(jié)的空行要求。
多個連續(xù)的空行是允許的,但沒有必要這樣做(我們也不鼓勵這樣做)。
一個類的總體行數(shù)盡量控制在400行左右(不超過一千行)。
五、資源處理
EntityTransaction tranx = null; try { // 獲取數(shù)據(jù)庫事務(wù) tranx = em.getTransaction(); // 開始事務(wù)過程 if(!tranx.isActive()){ tranx.begin(); } // 保存實(shí)體 Query query = em.createNamedQuery(jpqlName); if(params!=null && !params.isEmpty()){ params.forEach((k,v)->{ query.setParameter(k, v); }); } query.executeUpdate(); // 提交事務(wù) tranx.commit(); } catch (Exception ex) { // 記錄錯誤日志 DaoLog.LOG.error("刪除對象異常"); DaoLog.LOG.error(ex.getMessage(), ex); if(tranx != null){ tranx.rollback(); } return false; }finally{ if(tranx !=null && tranx.isActive()){ tranx.commit(); } em.close();//注意 用完一定要釋放 }
六、異常處理
比較底層的處理單元,建議拋出異常。
業(yè)務(wù)處理模塊,處理異常的同時(shí),異常必須要加日志!最好有finally處理。
方法返回結(jié)果,不要使用異常方式。
七、相同的代碼快,不要到處出現(xiàn)或者重復(fù)出現(xiàn)!
相同代碼提取處理,讓代碼可重用。
八、注釋
1、源文件注釋
源文件注釋采用 /* …… /,在每個源文件的頭部要有必要的注釋信息,包括:文件名;文件編號;版本號;作者;創(chuàng)建時(shí)間;文件描述包括本文件歷史修改記錄等。中文注釋模版:
/**
文 件 名 :
CopyRright (c) 2015-xxxx:
文件編號:
創(chuàng) 建 人:
日 期:
修 改 人:
日 期:
描 述:
版 本 號:
*/
2、類(模塊)注釋:
類(模塊)注釋采用 /* …… /,在每個類(模塊)的頭部要有必要的注釋信息,包括:工程名;類(模塊)編號;命名空間;類可以運(yùn)行的JDK版本;版本號;
作者;創(chuàng)建時(shí)間;類(模塊)功能描述(如功能、主要算法、內(nèi)部各部分之間的關(guān)系、該類與其類的關(guān)系等,必要時(shí)還要有一些如特別的軟硬件要求等說明);
主要函數(shù)或過程清單及本類(模塊)歷史修改記錄等。
3、接口注釋:
接口注釋采用 /* …… /,在滿足類注釋的基礎(chǔ)之上,接口注釋應(yīng)該包含描述接口的目的、它應(yīng)如何被使用以及如何不被使用,塊標(biāo)記部分必須注明作者和版本。
在接口注釋清楚的前提下對應(yīng)的實(shí)現(xiàn)類可以不加注釋。
4、構(gòu)造函數(shù)注釋:
構(gòu)造函數(shù)注釋采用 /* …… /,描述部分注明構(gòu)造函數(shù)的作用,不一定有塊標(biāo)記部分。
5、函數(shù)注釋:
函數(shù)注釋采用 /* ……/,在每個函數(shù)或者過程的前面要有必要的注釋信息,包括:函數(shù)或過程名稱;功能描述;
輸入、輸出及返回值說明;調(diào)用關(guān)系及被調(diào)用關(guān)系說明等。函數(shù)注釋里面可以不出現(xiàn)版本號(@version)。
6、方法注釋:
方法注釋采用 /* …… /,普通成員方法要求說明完成什么功能,參數(shù)含義是什么且返回值什么;另外方法的創(chuàng)建時(shí)間必須注釋清楚,為將來的維護(hù)和閱讀提供寶貴線索。
7、方法內(nèi)部注釋:
控制結(jié)構(gòu),代碼做了些什么以及為什么這樣做,處理順序等,特別是復(fù)雜的邏輯處理部分,要盡可能的給出詳細(xì)的注釋。
8、全局變量注釋:
要有較詳細(xì)的注釋,包括對其功能、取值范圍、哪些函數(shù)或者過程存取以及存取時(shí)注意事項(xiàng)等的說明。
9、局部(中間)變量注釋:
主要變量必須有注釋,無特別意義的情況下可以不加注釋。
10、實(shí)參/參數(shù)注釋:
參數(shù)含義、及其它任何約束或前提條件。
十、if else 條件含義要明確
如: if (isOk) { //isOK 如何 return Response.status(200).entity(resp.getData()).build(); } else { return Response.status(200).entity(resp.getErrorInfo()).build(); }
十一、邏輯控制,不要瀑布流!
盡量把條件不滿足的情況寫在某個邏輯塊的前面(比如方法的最前面),讓不滿足條件的情況快速失敗,讓代碼整理結(jié)構(gòu)清晰,可讀。
十二、巧用構(gòu)造函數(shù)構(gòu)造者builder模式:
構(gòu)造方法:UserDetailInfo userinfo = new UserDetailInfo(user); builder方式: Mapoparams = ImmutableMap. builder() .put("appid", ConfigUtil.APPID)// 服務(wù)號的應(yīng)用號 .put("body", WeixinConstant.PRODUCT_BODY)// 商品描述 .put("mch_id", ConfigUtil.MCH_ID)// 商戶號 ? .put("nonce_str", PayCommonUtil.CreateNoncestr())// 16隨機(jī)字符串(大小寫字母加數(shù)字) .put("out_trade_no", orderId)// 商品訂單號 .put("total_fee", "1")// 銀行幣種 .put("spbill_create_ip", ip)// IP地址 .put("notify_url", ConfigUtil.NOTIFY_URL) // 微信回調(diào)地址 .put("trade_type", "APP")// 支付類型 app .build();
十三、數(shù)據(jù)結(jié)構(gòu)與業(yè)務(wù)處理(算法)分開
如: MVC MVVM 都可以參考
十四、關(guān)鍵業(yè)務(wù)添加日志記錄
LoggerUtils.loginLogger.info(String.format("xx用戶[%s] at %s 登陸xxx app", sb.toString(),DateUtils.getDateTime()));
最后啰嗦一句 :寫代碼一個類寫完了 去掉無效的引用,也就是import的時(shí)候。
補(bǔ)充:養(yǎng)成好習(xí)慣,祝大家寫好代碼,迎娶白富美,走上人生巔峰!
thx
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/64788.html
摘要:我們學(xué)習(xí)程序語言一定不要被束縛到語言細(xì)節(jié)和規(guī)范上面,而要從計(jì)算機(jī)邏輯執(zhí)行層面思考。多核的出現(xiàn)人們自然想到使多個線程同時(shí)執(zhí)行垃圾回收的工作,減少垃圾回收時(shí)間如,為了將啊垃圾回收對程序的影響降到最低,人們又發(fā)明了并發(fā)回收器,仍需要。 我們學(xué)習(xí)程序語言一定不要被束縛到語言細(xì)節(jié)和規(guī)范上面,而要從計(jì)算機(jī)邏輯執(zhí)行層面思考。細(xì)節(jié)和規(guī)范都是人為設(shè)定的,是大牛抽象計(jì)算機(jī)邏輯后的加工品。對于技術(shù)問題我們要...
摘要:寫在前面每年這個時(shí)候又到了求職的旺季。求職前,我們都會花很多的時(shí)間在自己的技術(shù)水平提升筆面試的準(zhǔn)備之上,但往往卻忽略了找工作第一步所需要的一個嚴(yán)謹(jǐn)且靠譜的簡歷。而程序員寫簡歷,第一步就是需要注意嚴(yán)謹(jǐn)而規(guī)范地使用各種技術(shù)詞匯。 ...
摘要:日期和時(shí)間處理日期和時(shí)間的函數(shù)庫。使用中可觀察序列,創(chuàng)建異步基于事件應(yīng)用程序的函數(shù)庫。為分布式系統(tǒng)提供延遲和容錯處理。發(fā)布使用本機(jī)格式分發(fā)應(yīng)用程序的工具。將程序資源和打包成和的本機(jī)文件。圖像處理用來幫助創(chuàng)建評估或操作圖形的函數(shù)庫。 好資源要分享原文 譯者 唐尤華 翻譯自 github akullpp 構(gòu)建 這里搜集了用來構(gòu)建應(yīng)用程序的工具。 Apache Maven:Mave...
摘要:資源獲取方式根據(jù)下面的索引,大家可以選擇自己需要的資源,然后在松哥公眾號牧碼小子后臺回復(fù)對應(yīng)的口令,就可以獲取到資源的百度云盤下載地址。公眾號二維碼如下另外本文會定期更新,松哥有新資源的時(shí)候會及時(shí)分享給大家,歡迎各位小伙伴保持關(guān)注。 沒有一條路是容易的,特別是轉(zhuǎn)行計(jì)算機(jī)這條路。 松哥接觸過很多轉(zhuǎn)行做開發(fā)的小伙伴,我了解到很多轉(zhuǎn)行人的不容易,記得松哥大二時(shí)剛剛決定轉(zhuǎn)行計(jì)算機(jī),完全不知道這...
閱讀 1719·2023-04-25 14:12
閱讀 1206·2021-08-27 16:24
閱讀 2621·2019-08-30 15:44
閱讀 2971·2019-08-30 13:16
閱讀 1756·2019-08-29 14:10
閱讀 1037·2019-08-29 13:54
閱讀 1376·2019-08-29 13:09
閱讀 1911·2019-08-26 18:37