《碼出高效》筆記

此文檔用於記錄《碼出高效》的二次篩選部分java

1、編程規範

(一)命名風格

1.代碼中的命名不能如下劃線或者是美圓的符號開始或結束
2.代碼中的命名嚴禁使用拼音和英文混合的方式
3.類名使用UpperCamelCase駝峯命名,可是如下狀況除外:DO/BO/DTO/VO/AO/PO/UID等
4.方法名,參數名,成員變量,局部變量都統一使用lowerCamelCase風格,聽從駝峯格式
5.常量的命名所有使用大寫,單詞之間用下劃線隔開,必須表達清楚
6.抽象類命名使用使用Abstract或者Base開頭,異常使用Exception結尾;測試類命名以測試的類的名稱開始,以Test結尾
  • 可使用模板模式生成命名
7.類型中與括號緊鄰相連來表示數組
  • 定義整形數組int[] arrayDemo
8.POJO類中布爾類型變量都不要加is的前綴,不然部分框架解析會引發序列化錯誤
  • 表達是與否的值採用is_xxx的命名方式,須要在<resultMap>設置從is_xxx到xxx的映射關係
9.包名統一使用小寫,點分隔符之間有且僅有一個天然語義的英語單詞。包名統一使用單數的形式,可是類名若是有複數的含義,類名可使用複數
10.避免在子父類的成員變量之間,或者不一樣代碼塊的局部變量之間採用徹底相同的命名,使可讀性下降
11.杜絕徹底不規範的縮寫,避免望文不知義
12.任何自定義編程元素在命名的時候,使用盡可能完整的單詞組合來表達它的意思
13.在常量和變量命名的時候,表示類型的名詞放在詞尾,以提高辨識度
  • startTimeworkQueue等等
14.若是模塊,接口,類,方法中使用了設計模式,在命名的時候須要體現出具體模式
15.接口類中的方法和屬性不要加任何的修飾符號(public也不要加),保持代碼的簡潔性
16.內部類的實現類用Impl的後綴與接口區別
17.枚舉類名加上Enum後綴,枚舉成員名稱須要所有大小寫,單詞之間用下劃線隔開
18.各層的命名規約
  • Service/DAO層方法命名規約程序員

    • 獲取單個對象的方法用get作前綴
    • 獲取多個對象的方法用list作前綴
    • 獲取統計值的方法用count作前綴
    • 插入的方法用insert
    • 刪除的方法用remove
    • 修改的方法用update
  • 臨域模型命名規則正則表達式

    • 數據對象:xxxDO
    • 數據傳輸對象:xxxDTO
    • 展現對象:xxxVO
    • POJO是DO/DTO/BO/VO的統稱,禁止命名爲xxxPOJO

(二)常量定義

1.不容許出現沒有預先定義的常量直接出如今代碼中
2.在long或者Long賦值的時候,數值以後使用大寫的L,不能是小寫的l,小寫容易與數字1混淆
3.不要使用一個常量類維護全部的常量,要按照常量功能進行歸類,分開維護
4.若是變量值僅在一個固定範圍以內變化用enum類型來定義

(三)代碼格式

1.左右小括號和字符之間不出現空格,而左大括號以前須要空格
2.if/for/while/switch/do等保留字與括號之間都必須加一個空格
3.任何兩目,三目運算符的左右兩邊都須要加一個空格
4.採用四個空格縮進,禁止使用tab
5.註釋的雙斜線與註釋內容之間有且僅有一個空格
6.在進行強制轉換的時候,右括號和強制轉換值之間不須要任何空格隔開
7.單行的字符數不超過120個,超過須要換行
8.方法參數在定義和傳入的時候,多個參數逗號後面必須加空格
9.IDE的編碼設置爲UTF-8,IDE文件的換行符使用Unix格式
10.單個方法的總行數不能超過80行
11.沒有必要增長若干的空格來使變量的賦值等號與上一行對應位置的等號對齊
12.不一樣邏輯,不一樣語義,不一樣業務的代碼之間插入一個空行分割開來以提高可讀性

(四)OOP規約

1.避免經過一個類的對象引用訪問此類的靜態變量或靜態方法,直接使用類名來訪問便可
2.全部的覆寫方法都須要加@Override註解
3.相同參數類型,相同業務含義,纔可使用Java的可變參數(儘可能不用可變參數)
4.外部正在調用或者兩方庫依賴的接口,不容許修改方法簽名,避免對接口調用方產生影響
5.不能使用過期的類或者是方法
6.Object的equals方法容易拋出空指針異常,應該使用常量或者肯定有值的對象來調用equals
  • "test".equals(object)
7.全部的整型包裝類對象之間值的比較,所有使用equals方法比較
8.浮點數之間的等值判斷,基本數據類型不能夠用==來比較,包裝數據類型不能用equals來進行判斷
  • 浮點數採用「尾數+階碼」的編碼方式,二進制沒法表示出大部分的十進制小數
9.定義數據對象DO類的時候,屬性類型要與數據庫字段類型相匹配
10.關於基本數據類型與包裝類型
  • 全部的POJO類屬性必須使用包裝數據類型
  • RPC方法的返回值和參數必須使用包裝數據類型
  • 全部的局部變量使用基本數據類型
11.序列化類新增屬性的時候,不要修改serialVersionUID字段,避免反序列失敗
12.構造方法中禁止加入業務邏輯
13.POJO類必須寫toString方法
14.使用索引訪問用String的split方法獲得的數組的時候,須要作最後一個分隔符以後有無內容的檢查,不然會有IndexOutOfBoundsException的風險
15.當一個類有多個構造方法,或者多個同名的方法的時候,這些方法應該按照順序放置在一塊兒,便於閱讀
16.類內方法定義的順序依次是:公有方法或者是保護方法 > 私有方法 > getter/setter方法
17.setter方法中,參數名稱與類成員變量名稱一致,this.成員名 = 參數名
18.循環體內,字符串的鏈接方式,使用StringBuilder的append方法進行擴展
19.final能夠聲明類,成員變量,方法,以及本地變量
  • 不容許被繼承的類,如:String類
  • 不容許修改引用的域對象
  • 不容許覆蓋的方法,例如POJO類中的setter方法
  • 不容許運行過程當中從新賦值的局部變量
  • 避免上下文重複使用一個變量
20.慎用Object的clone方法來拷貝對象
  • 對象clone方法默認是淺拷貝,若是想實現深拷貝須要覆寫clone方法實現域對象的深度拷貝
21.類成員與方法訪問控制從嚴
  • 若是不容許外部直接經過new來建立對象,那麼構造方法必須是private
  • 工具類不容許有public構造方法
  • 類非static成員變量而且與子類共享,必須是protected
  • 類非static成員變量而且僅在本類使用,必須是private
  • 類static成員變量若是僅在本類使用,必須是private
  • 若是是static成員變量,考慮是否爲final
  • 類成員方法只供類內部調用,必須是private
  • 類成員方法只對繼承類公開,那麼限制爲protected

(五)集合處理

1.關於hashCode和equals的處理
  • 只要是覆寫equals,就必須覆寫hashCode
  • 由於Set存儲的是不重複的對象,一句hashCodeequals進行判斷,因此Set存儲的對象必須覆寫這兩個方法
  • 若是自定義對象做爲Map的鍵,那麼必須覆寫hashCodeequals
2.使用Map的方法返回集合對象的時候,不能夠對其進行添加元素操做,不然會拋出異常
3.使用集合轉數組的方法,必須使用集合的toArray(T[] array),傳入的是類型徹底一致,長度爲0的空數組
  • List<String> list = new ArrayList<>(2);
    list.add("guan");
    list.add("bao");
    String[] array = list.toArray(new String[0]);
4.泛型通配符<? extends T>來接收返回的數據,此寫法的泛型集合不能使用add方法,而<? super T>不能使用get方法,做爲接口調用賦值的時候容易出錯
5.集合初始化的時候,指定集合初始值的大小

(六)併發處理

1.獲取單例對象須要保證線程安全,其中的方法也要保證線程安全
2.建立線程或者是線程池請指定有意義的線程名稱,方便出錯的時候進行回溯
3.線程資源必須經過線程池提供,不容許在應用中自行顯式建立線程
  • 減小在建立和銷燬線程上消耗的時間以及系統資源的開銷
4.線程池經過ThreadPoolExecutor的方式,規避資源耗盡的風險
5.若是使用SimpleDateFormat須要加鎖,不然使用DateUtils工具類
6.必須回收自定義的ThreadLocal變量,儘可能在try-finally中進行回收
7.高併發的時候,同步調用須要去考量鎖的性能損耗
8.對多個資源,數據庫表,對象同時加鎖的時候,須要保持一致的加鎖順序,不然可能會致使死鎖
9.在使用嘗試機制來獲取鎖的方法中,進入業務代碼以前須要先判斷當前線程是否持有鎖。鎖的釋放規則與鎖的阻塞等待方式相同
10.若是每次訪問衝突的機率小於20%,推薦使用樂觀鎖,不然使用悲觀鎖
11.資金相關的金融敏感信息,使用悲觀鎖策略
12.volatile若是是多寫沒法解決線程安全問題
13.ThreadLocal對象使用static修飾,ThreadLocal沒法解決共享對象的更新問題

(七)控制語句

1.在一個switch塊內,都必須包含一個default語句而且放在最後,即便是什麼代碼也沒有
2.在if/else/for/while/do語句中必須使用大括號
3.在高併發場景中,避免使用「等於」判斷做爲中斷或退出的條件
4.不要在其餘表達式中,插入賦值語句

(八)註釋規約

1.類,類屬性,類方法的註釋必須使用Javadoc規範
2.全部的類必須添加建立者和建立日期
3.全部的枚舉類型字段必須有註釋,說明每一個數據項的用途
4.謹慎註釋掉代碼

(九)其餘

1.在使用正則表達式的時候,利用好預編譯的功能
2.獲取當前毫秒數System.currentTimeMillis();

(十)異常日誌

1.捕獲異常是爲了處理它,不要捕獲以後什麼都不作直接拋棄
2.有try塊放到了事務代碼中,catch異常以後,若是須要回滾事務,必定要注意手動回滾事務
3.不要在finally塊中使用return
4.捕獲異常與拋出異常必須是徹底的匹配,或者捕獲異常是拋異常的父類
5.防止NPE,是程序員的基本素養

(十一)日誌規約

1.應用中應該依賴使用日誌 框架SLF4J中的API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一
2.異常信息應該包括兩類信息:案發現場信息和異常堆棧信息。若是不處理,那麼經過關鍵字throws往上拋出
3.謹慎的記錄日誌,要注意日誌的輸出量的問題,避免將服務器磁盤撐爆

二.單元測試

1.好的單元測試必須遵照AIR原則(自動化,獨立性,可重複)

三.安全規約

1.用戶敏感數據禁止直接展現,必須對展現數據進行脫敏
2.用戶輸入的SQL參數嚴格使用參數綁定或者METADATA字段值限定,防止SQL注入,禁止字符串拼接SQL訪問數據庫
3.用戶請求傳入的任何參數必須作有效性驗證
4.禁止向HTML頁面輸出未經安全過濾或未正確轉義的用戶數據
5.表單,AJAX提交必須執行CSRF安全驗證
6.用戶本身生成內容的場景必須實現防刷,文本內容違禁詞過濾等風控策略

四.MySQL數據庫

(一)建表規約

1.表達是與否的概念的字段,必須使用is_xxx的方式命名,數據類型是unsigned tinyint
2.表名,字段名必須使用小寫字母或者是數字,禁止使用數字開頭
3.表名不使用複數名詞
4.禁止使用保留字
5.主鍵索引名爲pk_字段名;惟一索引名爲uk_字段名;普通索引名爲idx_字段名
6.小數類型爲decimal
7.表必備的三個字段:id,create_time,update_time
8.表的命名最好是遵循「業務名稱_表的做用"
9.單表的行數超過500w行或者單表容量超過2GB,才推薦進行分庫分表

(二)索引的規範

1.超過三個表禁止join
2.利用覆蓋索引來進行查詢操做,避免回表
3.建組合索引的時候,區分度最高的在最左邊
4.建立索引的誤解
  • 寧濫勿缺:認爲一個查詢就須要建一個索引
  • 寧缺毋濫:認爲索引會消耗空間,嚴重拖慢記錄的更新以及行的新增速度

(三)SQL語句

1.count(*)會統計值爲NULL的行,而count(列名)不會統計此列爲NULL值的行

(四)ORM映射

1.不容許直接拿Hashmap和Hashtable做爲查詢結果集的輸出
2.@Transaction事務不要濫用。事務會影響數據庫的QPS,另外使用事務的地方須要考慮各個方面的回滾方案

(五)服務器

1.高併發服務器建議調小TCP協議的time_wait超時時間
2.調大服務器所支持的最大文件句柄數
3.給JVM環境參數設置:-XX:+HeapDumpOnOutMemoryError參數,讓JVM碰到OOM場景的時候輸出dump信息
4.在線上生產環境,JVM的Xms和Xmx設置同樣大小的內存容量,避免在GC後調整堆大小帶來的壓力
5.服務器內部重定向使用forward;外部重定向地址使用URL拼裝工具類來生成,不然會帶來URL維護不一致的問題和潛在的安全風險
相關文章
相關標籤/搜索