1. 程式人生 > >軟體質量之道:SourceMonitor

軟體質量之道:SourceMonitor

有些事非做不可,並非為了幸福,而是緩解痛苦,因為不做,則更痛苦——這便是無奈。

夏中義 《文心獨白》

1 引子

部落格又有一陣子沒更新了,最近認真思考了阿里上市的成功之處:選擇和堅持。其實人生並沒有絕對的對與錯,也沒有絕對的成功與失敗。正如“有些人活著,他已經死了”云云,我總是拿對與錯來讓自己選擇,其實就是根本的錯誤。決定走一條路,就繼續走下去,終點雖然不知道在哪裡,那就盡情享受沿途的風景,以及珍惜與身邊的陪伴著的人的分分鐘鍾!

扯得有點遠,迴歸主題。之前討論了軟體質量之道的各個方面,但是也都是一些虛話,達不到真正的目的。既然如此,還不如針對上一篇文章結尾部分的流程圖的每個部分,進行詳細的描述,達到人人可用的效果,使之發揚光大。

循序漸進,首先先說一下各個工具的用途以及使用方法,然後再說明如何用Ant進行管理,最後再統一加到CruiseControl中進行排程。

2 SourceMonitor簡介

SourceMonitor是一款免費的軟體,執行在Windows平臺下。它可對多種語言寫就的程式碼進行度量,包括C、C++、C#、Java、VB、Delphi和HTML,並且針對不同的語言,輸出不同的程式碼度量值。

像其他程式碼度量工具一樣,SourceMonitor只關注程式碼,併為編碼人員提供及時的反饋,它不是一款專案管理工具,不關注專案實施中從功能分析到設計編碼,再到測試這整個過程。

SourceMonitor只是一個“度量”工具,但是通過基本的度量,可以從程式碼表面層次發現一些根本的,基礎的問題,所以將其作為介紹的第一個工具,也應當成為最基礎的一個工具來為軟體質量把關。

3 SourceMonitor度量值

說到SourceMonitor的度量,對於不同的語言提供不同方面的度量,這裡僅針對C++進行介紹,其提供了以下幾方面的度量。(關於其他語言,請參考SourceMonitor的幫助文件Explanation of Language Metrics章節)

1. 總行數(Lines)

包括空行在內的程式碼行數。

2. 語句數(Statements)

在C++中,語句是以分號結尾的。分支語句if,迴圈語句for、while,跳轉語句goto都被計算在內,預處理語句#include、#define和#undef也被計算在內,對其他的預處理語句則不作計算,在#else和#endif、#elif和#endif之間的語句將被忽略。

3. 分支語句比例(Percent Branch Statements)

該值表示分支語句佔語句數目的比例,這裡的“分支語句”指的是使程式不順序執行的語句,包括if、else、for、while、break、continue、goto、switch、case、default和return。需要注意的是,do不被計算在內,因為其對應的while已經計算了。另外,異常處理的catch也被作為一個分支計算。

4. 註釋比例(Percent Lines with Comments)

該值指示註釋行(包括/*……*/和//……形式的註釋)佔總行數的比例。一般公司會對每個文件的header或者footer部分進行特殊的宣告註釋,可以再工程屬性中設定過濾,不計算在內。

5. 類個數(Classes)

包括class,struct和template在內的個數。

6. 平均每個類方法數(Methods per Class)

平均每個類的方法數,即包括內聯和非內聯的,template函式在內的類方法數除以所有類的個數。

7. 函式個數(Functions)

所有函式的個數。

8. 平均每個函式包含的語句數目(Average Statements per Method)

總的函式語句數目除以函式數目得到該值。

9. 函式圈複雜度(Function Complexity)

圈複雜度指示一個函式可執行路徑的數目,以下語句為圈複雜度的值貢獻1:if/else/for/while語句,三元運算子語句,if/for/while判斷條件中的"&&"或“||”,switch語句,後接break/goto/ return/throw/continue語句的case語句,catch/except語句等。對應有最大圈複雜度(Max Complexity)和平均圈複雜度(Avg Complexity)。

10. 函式深度(Block Depth)

函式深度指示函式中分支巢狀的層數。對應有最大深度(Max Depth)和平均深度(Avg Depth)。

4 SourceMonitor實戰

下面介紹如何使用SourceMonitor建立工程,針對不同的Solution活著Project建立Checkpoint。

1. 安裝SourceMonitor,這個不詳細介紹,下載安裝即可。

2. 開啟SourceMonitor,建立工程。


3. 選擇語言,並點選下一步。


4. 為當前工程命名,並選擇工程檔案儲存路徑。


5. 選擇當前工程要度量解析的檔案,可以通過配置檔案列表(XML)或者指定路徑自動搜尋方式新增。


6. 選擇相關的配置,可以直接下一步忽略,如果有相關需要進行選擇設定。



7. 指定當前Checkpoint的名稱。


8. 檢視配置項,並確定。


9. 確認要度量的檔案列表。


10. 工程建立完畢,並完成第一個度量點。


11. 雙擊檢查點,檢視各個檔案的度量值。


12. 雙擊某個檔案,檢視詳細資訊。


這樣,基本的一個工程就建立完畢了,其他的功能,例如設定各個指標的預設值,大家可以自己嘗試一下。

5 配置SourceMonitor到編輯器內

由於SourceMonitor是程式碼度量最基礎的一個模組,所以每個程式設計師都可能會將其作為程式碼評測的一個常用功能項新增到熟悉的編輯器中。這樣每寫完一段程式碼,都可以執行檢測一下當前檔案是否滿足度量指標。

5.1 Visual Studio設定

1. 設定外部工具。


2. 新增並配置選項


Title: SourceMonitor

Command: 安裝SourceMonitor的目錄

Arguments: /DC++ $(ItemPath)

Initial directory: $(SolutionPath)

3. 新增快捷鍵


選擇剛才新增SourceMonitor是ExternalTools裡面第幾個,例如說我剛才新增的位置為第六個,則選擇Command6,並指定快捷鍵(我預設指定為Alt + 1,這個根據個人喜好來,但是儘量別造成快捷鍵衝突)。


4. 開啟某個檔案,按快捷鍵執行SourceMonitor,結果就顯示出來了。


5.2 UltraEdit設定

由於很多公司都會開發二次語言,來適合自己工具的使用。這種語言可能跟C或者某些語言很相似,但是用Visual Studio這種龐大的工具來開啟,效率不是很高,所以有可能選擇使用一些輕量級的編輯器,例如說UltraEdit這種,那麼新增方法跟Visual Studio類似,如下。

1. 工具欄配置新增新工具。


2. 進行引數設定


名稱: SourceMonitor

命令列: "D:\SourceMonitor\SourceMonitor.exe" /DC++"%f"

工作目錄: %p

3. 點選執行,或者通過快捷鍵執行。

5.3 其他工具設定

如果使用其他工具,則可以參考工具的幫助文件,修改/DC++後的檔名稱引數以及工作目錄引數即可。

6 進一步思考

又到了最後關鍵的一步了,談一下近期的一些感悟吧。有些事情不瞭解的時候,總會從消極的角度的方面去考慮問題。

例如說,以前我對多執行緒不是很瞭解,我便會極力的保護自己“不懂多執行緒”這個缺點,從而去從消極的角度及方面評判多執行緒。但是最近處理大規模資料檔案時(大概2000萬個以上),我卻深深的體會到了多執行緒的各個方面的優勢,也學會了更多的知識,雖然也寫出了讓大牛們嘲笑的“自旋鎖”程式碼,看過《Imperfect C++》關於多執行緒的那一節後,立馬臉紅了,利用週末的時間,徹底修改了這個“問題”。

另外,再接觸這方面的知識時,就會從不同的角度上去理解及思考,也發現了更多更有趣的內容,例如怎麼用C++11的非同步,把介面和處理扔到不同的執行緒中去,又怎樣把Log扔到對應的Log列印視窗中去,真是其樂無窮啊。

上週末,又看了一遍《星際寶貝》,也總結了最近各個不盡人意的方面,發現自己以前實在是太過自我為中心,有很多問題不知道從自己找原因,而不斷的責備別人(真心的對被我傷害的人說聲對不起)。還是應該時時刻刻警醒自己,如果“壞蛋”成分要滿了,那就暫時放下所有的事,“治療”好了再繼續,不要因為自己而犯錯!