一個項目從搭建開始,開發的初期往往思路比較清晰,代碼也比較清晰。隨着時間的推移,業務越來越復雜。代碼也就面臨着耦合,冗余,甚至雜亂,到最后誰都不敢碰。
作為一個互聯網電子商務網站的業務支撐系統,業務復雜不言而喻。從09年開始一直沿用到現在,中間代碼經過了多少人的手,留下了多少的坑,已經記不清楚了,誰也說不清了。
代碼的維護成本越來越高。代碼已經急需做調整和改善。最近項目組專門設立了一個小組,利用業余時間做代碼分析的工作,目標對核心代碼進行分析並進行設計重構。
代碼分析如果用人工來做,需要兩點:1、開發人員代碼造詣要求很高。2、開發人員投入時間成本非常大。
然而現在網絡上 Java代碼分析工具做的比較好。所以考慮開始利用這些工具對代碼進行分析,並做修改。當然最好在最后有個資深人士做相關的review或開發人員自檢。
先考慮工具吧,工欲善其事,必先利其器。所以決定search一下,代碼分析和代碼分析的工具,便於更好的利用和進行。
學習一下並做一些歸納:
提到靜態代碼的概念:個人理解為 不需要運行起來的代碼所關注的點。就是就代碼看代碼,語法、結構、接口、類等。
整個軟件開發生命周期中,網上說30% 至 70% (占有量還是很大的)的代碼邏輯設計和編碼缺陷是可以通過靜態代碼分析來發現和修復的。看來效果還是很明顯的。
靜態代碼分析的好處,的確有很多好處:
1. 幫助程序開發人員自動執行靜態代碼分析,快速定位代碼隱藏錯誤和缺陷。
2. 幫助代碼設計人員更專注於分析和解決代碼設計缺陷。
3. 顯著減少在代碼逐行檢查上花費的時間,提高軟件可靠性並節省軟件開發和測試成本
概念不多提了,看工具:
1、findbugs:
安裝:http://sourceforge.net/projects/findbugs/
看使用體驗:針對一個項目啟動findbugs,會進入findbugs的工作視圖
如上圖
藍色區域:羅列出了findbugs在代碼中檢測到的代碼問題。同樣的紅色為嚴重的,黃色為警告。
由於自己寫的學習項目所以代碼不龐大,質量也還行,所以檢測出來的都是黃色警告的。
紫色區域:點擊對應的檢測點,能定位到問題代碼具體的位置,並且在左邊有個bug蟲子給出具體問題的信息
綠色區域:對應左邊藍色區域的檢測點,給出的詳細描述和建議。
個人覺得findbugs對於代碼檢測的深度力度要更好。比如,子類名和父類名相同,死存儲(沒有調用卻開辟空間的),一個方法沒有對參數對象驗證空等等。
對代碼的質量檢查做的很到位。而且很清晰。當然findbugs 也有自定義的設置,個人覺得現有功能已經很好用了,不需要自定義。
2、Checkstyle :
安裝:http://sourceforge.net/projects/eclipse-cs/files/latest/download下載插件,links plugin的方式安裝到eclipse中
重點看使用體驗:針對一個項目啟動checkStyle之后
剛檢測完,項目所有類都泛黃,甚至有的類打上了小紅叉。靜心仔細的看下:
提示有:public修飾符多余,一行超過80個字符,缺少文檔注釋,魔法數字等等等等。出現中文代碼的地方會直接打紅叉。非常精細。
藍色區域:包括Errors和warnings。Errors重點列出了代碼中的問題,比如代碼中有中文等等,Warnings:一般是代碼風格不好的地方。比如代碼
最后一行加注釋算是不好的風格
紫色區域:發現用於特定的注釋分割,很多注釋都有問題,和eclipse自動格式化有沖突,我覺得可以是忽略的。左邊的小放大鏡有詳細的不規范信息。
個人覺得檢查的精度還是很細的,但是對於注解等的檢測過於精細,很擾亂視眼。Errors級別就可以了。和eclipse的格式化有很多的沖突。導致很多也是不必要的檢驗。
當然,也是可以自定義設置檢測項,如下:
這樣可以把注釋的或者和日常格式化有問題的檢查撤銷掉。主要檢查代碼的問題。不過說實話這個設置起來還是很麻煩的,我覺得還不如將就着看所有的提示
信息。不需要改的就人為忽略吧。重點關注Errors。從中看出,這款其實主要側重的還是代碼的風格的檢測。
3、PMD
下載安裝:http://sourceforge.net/projects/pmd/files/pmd-eclipse
安裝完成,針對一個項目啟用PMD檢測,進入pmd工作視圖
如上圖:
藍色區域:是匯總的有問題的代碼,pmd將代碼分析完之后的級別划分的更細致了,就是5個小圈對應:error high, error, warning high, warning,infomation。
綠色區域:定位,並且給出問題描述。
這款代碼檢測軟件應該說是和findbugs是屬於一種類型的。在我檢測的代碼中,被pmd標記最多的是代碼中有system.out.println() ,的確在正式項目中不應出現這種語句。
同樣方法的大小寫是否符合規范也會檢查出來。在代碼檢測中也更多的關注error high,error。
另一方面pmd插件有20M大小,說明他的檢測會很細致,也很廣泛。
總結
對於工具的探索就到這,因為我覺得這三款工具對於現在項目的檢測力度已經夠用了。而jtest由於是商業非開源產品,就不去下載破解版驗證了。
現在對以上工具進行一下總結:
findbugs:非常好用的一款代碼檢測工具,檢測的深度比較深,對代碼中滲透的性能,內存的使用釋放有很好的檢測。能檢測出可能導致錯誤的代碼,如空指針引用等等。
我覺得這款檢測工具應該是首選必備的。
checkstyle:顧名思義,他就是一款檢測代碼風格樣式的工具,對ccs都會有檢測,可以用以輔助提高開發過程中的代碼風格。缺點很多檢測過於細致和格式化沖突,
比如注釋都會高亮顯示,很擾亂視線,所以使用時候組號可以做自定義的風格規范。對代碼的bug發現力度較弱。
PMD:20M大小,說明他的檢測非常的廣,在我看來的確也是,system.out.println 也會做為error提示。一些命名的檢測等。的確並不是代碼的bug,
而是項目中代碼的規范檢測。深度沒有findbugs深,在使用findbugs的情況下,可以配合pmd來檢測一些不規范的代碼。
能通過以上這三款軟件的檢測,並加上業務代碼的review。相信代碼的質量級別應該是很高了,相信也能很好的滿足日常的開發和后期的維護了。