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