1. 程式人生 > >記錄安全掃描後進行的程式碼重構各類問題以及處理辦法

記錄安全掃描後進行的程式碼重構各類問題以及處理辦法

專案因為是政府的專案,需要對程式碼進行安全掃描,花了點時間對程式碼進行重構,所以對問題做下記錄,大家有更好的解決辦法歡迎指出,會隨時進行補充問題

1Either log or rethrow this exception.(日誌或重新丟擲此異常。

處理方式:在catch中加上列印日誌

          logger.error("新增的說明資訊 ",e);

2Remove this useless assignment to local variable "XXX".(刪除這個無用的賦值到區域性變數“XXX”)

處理方式:將這兩段程式碼合併為一列 List<String> timelist = getTimeList();

3This block of commented-out lines of code should be removed.(刪除這段註釋掉的程式碼塊)

處理方式:直接將註釋的程式碼刪除

4Define a constant instead of duplicating this literal "repeatData" 3 times.(定義一個常量,而不是重複這個“repeatData”3次。

例子:在一個類裡面多次使用了一樣的字串文字

處理方式:定義類常量或者列舉類或者介面常量類,用常量來代替重複的文字

5duplicated blocks of code must be removed.(必須刪除重複的程式碼塊。)

這類問題在程式碼重構是碰到最多的

處理方式:抽取重複的程式碼塊作為一個共用的方法或者抽取工具類方法

6Refactor this code to not nest more than 3 if/for/while/switch/try statements.(重構此程式碼以不巢狀超過3 if/for/while/switch/try語句。)

這也是最常見的問題 巢狀if for過多

解決辦法:1抽取方法,

                2.使用設計模式

                3. 採用衛語句

7.Refactor this method to reduce its Cognitive Complexity from 48 to the 15 allowed.(重構這種方法,將其認知複雜性從48降低到15。)

表示一個方法行數很多比較複雜,同樣的解決辦法就是抽取方法,講一個方法拆分幾個方法

8.Method has 9 parameters, which is greater than 7 authorized.(方法有9個引數,大於7個授權引數。)

一個方法引數過多,解決辦法封裝成物件或者map

9Replace the synchronized class "StringBuffer" by an unsynchronized one such as "StringBuilder".(將同步類“StringBuffer”替換為非同步類,例如“StringBuilder”。)

其實如果用StringBuffer時 jdk也會進行鎖消除的

10Refactor this method to throw at most one checked exception instead of: java.lang.NoSuchMethodException, java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException(重構此方法以丟擲最多一個檢查異常)

解決辦法:自定義執行時異常,或者丟擲更大的異常

11NullPointerException might be thrown as 'session' is nullable here(可能會丟擲NullPointerException,因為“session”在這裡是可空的)

處理方式:加一個非空判斷

12Close this "InputStreamReader".(關閉這個“InputStreamReader”。)

輸入輸出流在finally中進行關閉

13、Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.(新增一個巢狀註釋,解釋為什麼這個方法是空的,丟擲UnsupportedOperationException,或者完成這個實現。)

處理方式:因為不需要實現這個方法所以直接添加註釋解釋一下

14Make "modelparam" transient or serializable.

 

頂層介面物件或者抽象類的引用是沒有實現序列化介面的,所以實體實現了系列化的時候,這些頂層介面的引用編譯時無法確定型別

解決方法:

  1. 使用實現了序列化介面的子類
  2. 使用transient關鍵字表示不序列化該欄位

15Reduce the number of conditional operators (7) used in the expression (maximum allowed 3).

一個if的條件表示式過多問題

解決辦法提取表示式成為一個方法

變更前:

變更後: