乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      一網(wǎng)打盡CodeReview要點(diǎn)(JAVA)

       codingparty 2019-08-17

      常規(guī)檢查

      業(yè)務(wù)

      1. 根據(jù)需求檢查業(yè)務(wù)邏輯代碼是否正確
      2. 檢查代碼是否符合編碼規(guī)范
      3. 檢查代碼是否存在潛在bug或內(nèi)存泄露
      4. 檢查代碼是否存在性能瓶頸

      常見BUG

      1. 空指針異常,如使用對象時為保證其非null
      2. 類型轉(zhuǎn)換異常,如強(qiáng)制轉(zhuǎn)換
      3. 算術(shù)異常,如除數(shù)為0
      4. 越界異常,如數(shù)組越界
      5. 內(nèi)存溢出異常,如棧溢出(遞歸)、堆溢出等
          例如:遞歸函數(shù)必須有閉環(huán)條件即終止條件,或遞歸層級建議1000以內(nèi)
      6. 對象隱式更新造成業(yè)務(wù)錯誤,如更新對象時未考慮其他業(yè)務(wù)正在使用

      檢驗(yàn)


      1. API入口參數(shù)必須有常規(guī)及業(yè)務(wù)性校驗(yàn)
      2. JAVA中對象使用之前必須有非空(null)校驗(yàn),
        注意:在業(yè)務(wù)流程上有非空校驗(yàn)即可,例如一個對象之前已經(jīng)做過校驗(yàn),不做變更的情況下,再次使用則無需校驗(yàn)
      3. 數(shù)值類型在做除數(shù)計算之前必須進(jìn)行非0校驗(yàn)

      編碼風(fēng)格


      1. JAVA控制層訪問路徑,均以小寫命名多個單詞則以下劃線相連,層級保持在5級以內(nèi)
      2. JAVA類名以大駝峰命名(例如:ClassName)
      3. 函數(shù)及變量名以小駝峰命名(例如:functionName)
      4. 常量名以全大寫命名多個單詞則以下劃線相連(例如:NAME_TYPE)
      5. 函數(shù)參數(shù)個數(shù)保持在5個以內(nèi)
      6. 函數(shù)返回值要以具有業(yè)務(wù)含義的對象返回,禁止使用Map作為返回值
      7. 魔術(shù)數(shù)字必須以枚舉的方式統(tǒng)一定義并描述其業(yè)務(wù)含義
      9. 代碼單行長度不易超過100個字符
      10. 單個類文件總代碼行數(shù)不可超過500行,推薦200以內(nèi)
      11. 單行代碼不易出現(xiàn)多層括號嵌套,例如:(),{},[]的多層嵌套
      12. 字符串比較將常量放在左邊,例如 “a”.equals(name)
      13. if..else嵌套不可大于3層

      異常處理


      1. API接口調(diào)用、庫函數(shù)調(diào)用、系統(tǒng)服務(wù)調(diào)用必須進(jìn)行異常處理或?qū)惓佒琳{(diào)用者,不可將異常信息吞掉,例如try{//業(yè)務(wù)處理}catch(Exception e){//不做任何處理}
      2. 處理異常禁止如下操作,通過日志工具記錄異常信息
          try{//業(yè)務(wù)處理}catch(Exception e){ e.printStackTrace(); }
      3. 禁止異常處理出現(xiàn)在迭代里面,例如:for 、while、 foreach里面

      日志規(guī)范


      1. ERROR 記錄造成業(yè)務(wù)異常的日志,WARN記錄不影響業(yè)務(wù)流程的異常日志,INFO記錄業(yè)務(wù)流程狀態(tài)日志,DEBUG詳細(xì)的操作或數(shù)據(jù)日志
      2.  關(guān)鍵業(yè)務(wù)節(jié)點(diǎn)及業(yè)務(wù)流程發(fā)生狀態(tài)變化時必須記錄日志,關(guān)鍵函數(shù)或服務(wù)調(diào)用必須記錄日志
      3. 統(tǒng)一日志工具,例如:slf4j
      4. 統(tǒng)一日志格式,DEBUG,INFO,WARN,ERROR,此四類級別日志
         常規(guī)日志,例如:時間 日志級別 業(yè)務(wù)類型 日志內(nèi)容
         審計日志INFO級別,記錄在控制層,統(tǒng)一日志內(nèi)容格式,例如:“用戶id,業(yè)務(wù)模塊,操作類型,資源名稱,發(fā)起地址”
      5. 日志內(nèi)容禁止字符串拼接,建議統(tǒng)一以下格式
         logger.debug("illegalCode[{}]'s pattern is null", request.getIllegalCode())
      6. 在一個對象中通常只使用一個Logger對象,Logger應(yīng)該是static final的,只有在少數(shù)需要在構(gòu)造函數(shù)中傳遞logger的情況下才使用private final。
      7. 輸出Exceptions的全部Throwable信息,因?yàn)閘ogger.error(msg)和logger.error(msg,e.getMessage())這樣的日志輸出方法會丟失掉最重要的StackTrace信息。
      8. 不允許記錄日志后又拋出異常,因?yàn)檫@樣會多次記錄日志,只允許記錄一次日志。
      9. 不允許出現(xiàn)System print(包括System.out.println和System.error.println)語句。
      10. 不允許出現(xiàn)printStackTrace。
      11. 不允許出現(xiàn)調(diào)試用的Systom.out.pritln("")日志
      12. 日志性能的考慮,如果代碼為核心代碼,執(zhí)行頻率非常高,則輸出日志建議增加判斷,尤其是低級別的輸出<debug、info、warn>,至少INFO以下級別必須判斷,
          if(logger.isDebugEnabled()){
              logger.debug("illegalCode[{}]'s pattern is null", request.getIllegalCode())
          }

      冗余代碼


      1. 清除冗余導(dǎo)入,例如:import javax.servlet.ServletContext;導(dǎo)入了卻沒有使用
      2. 清除冗余注釋代碼,即注釋掉且不用的代碼
      3. 清除業(yè)務(wù)代碼中冗余的“main”函數(shù)及System.out.println(),如需測試建議在單元測試用測試
      4. 重復(fù)性代碼,若業(yè)務(wù)功能一致,必須抽離為公共模塊
      5. 避免冗余的導(dǎo)入,如:import java.util.*;
      6.代碼邏輯的冗余
          6.1. 業(yè)務(wù)邏輯上能提前終止的盡量提前終止,避免執(zhí)行過多的代碼,如:
               參數(shù)校驗(yàn)-->下載圖片-->校驗(yàn)數(shù)據(jù)是否重復(fù)-->保存數(shù)據(jù)
               以上流程可以改為如下:
               參數(shù)校驗(yàn)-->校驗(yàn)數(shù)據(jù)是否重復(fù)-->下載圖片-->保存數(shù)據(jù)

      性能


      1. 使用合適的數(shù)據(jù)類型及初始化大小
         例如:
         a. 多字符串的拼接單線程情況下使用StringBuilder
         b. 數(shù)據(jù)量固定且讀操作頻繁的話選擇數(shù)組存儲數(shù)據(jù)
         c. 集合的使用根據(jù)實(shí)際情況盡量初始化其容量
      2. 資源使用完畢及時釋放
         例如:
         a. 對象使用完畢,及時給變量賦值為null
         b. IO使用完畢要及時在finally中關(guān)閉掉
      3. 使用合適的數(shù)據(jù)處理方式:懶加載,異步和并行處理
      4. 使用合適的方式提升響應(yīng)速度:緩存、隊(duì)列
      5. 使用對象池,處理大量對象創(chuàng)建的問題
      6. 數(shù)組的拷貝建議使用系統(tǒng)函數(shù)System.arraycopy();
      7. synchronized、Lock,達(dá)到需求加鎖的代碼范圍或?qū)ο罅6仍叫≡胶茫虿贿m用!
          例如:
          Set<String> recordIds = new HashSet<>()
          String recordIdKey = genKey();
          synchronized (recordIds) {
              if (!recordIds.contains(recordIdKey)) {
                  //TODO 1 ...
                  //TODO 2 ...
                  recordIds.add(recordIdKey);
              }
           }
           方案1:
           Map<String,String> recordIds = new ConcurrentHashMap<>()
           String recordIdKey = genKey();
           if(recordIds.putIfAbsent()!=null){
             //TODO 1 ...
             //TODO 2 ...
           }
          方案2:
              可使用鎖池,recordIdKey獲取鎖之后再操作
      8. 迭代(for、foreach、while)嵌套不可大于3層,且在迭代中不可try...catch異常

      安全檢查

      接口

      1. 上傳資源接口,必須進(jìn)行資源類型、大小校驗(yàn)(如非必要禁止文件的執(zhí)行權(quán)限)
      2. 下載資源接口,必須進(jìn)行下載目錄校驗(yàn)且進(jìn)行唯一性資源下載限制
      3. 直接執(zhí)行系統(tǒng)指令的API,避免指令拼接的安全隱患

      業(yè)務(wù)


      1. 業(yè)務(wù)層面權(quán)限校驗(yàn),對資源的訪問必須有權(quán)限的限制

      密碼


      1. 密碼規(guī)則應(yīng)數(shù)字、字母、特殊字符組合,長度至少大于6位
      2. 密碼的加密規(guī)則盡量使用:AES256+IV
      3. 數(shù)據(jù)庫存儲及配置文件中的密碼應(yīng)進(jìn)行加密

      SQL


      1. sql編碼,必須處理sql注入的問題
      2. 請求參數(shù)必須進(jìn)行特殊字符的處理(參數(shù)進(jìn)入業(yè)務(wù)之前)

      并發(fā)


      1.  并發(fā)情況下,公共屬性、對象、數(shù)據(jù)必須進(jìn)行一致性處理(即并發(fā)安全處理)

      文檔檢查

      注釋


      1. API接口必須有功能描述,字段必須有業(yè)務(wù)描述
      2. API說明文檔必須和實(shí)際API接口保持一致
      3. 公共函數(shù)必須有功能描述,字段必須有業(yè)務(wù)描述
      4. 數(shù)據(jù)庫表必須有功能描述,字段必須有業(yè)務(wù)描述
      5. 常量(編碼)必須有業(yè)務(wù)描述

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多