iT邦幫忙

DAY 17
8

如何提升系統設計品質 - 技術與工具以.NET為例系列 第 17

[如何提升系統品質-Day17]品質量測工具-StyleCop

在前一篇文章[如何提升系統品質-Day16]Code Convention提到了Code Convention的一個範例,但規定是死的,人是賤的。 喔不,應該說,法律定下去,還是會有人貪圖便利而不遵守,程式的規範也是如此。

當開始有人不遵守規定,導致版本庫上的程式碼開始受到污染,若沒去處理它,就像破窗效應所提到的,窗會越破越多,洞會越來越多。可很多人以往的經驗,只要是程式碼可以動,沒有『看到』錯誤,就容易得過且過,睜一隻眼閉一隻眼。

這篇文章就是要介紹你好藥,介紹StyleCop這個工具,可以用來檢測系統的程式碼是否符合規範。當然這些規範只是定義出比較符合一般設計,比較好的規範,若應用上有哪些rule是不合用的,使用者可自行刪減這些rule。讓系統中不符合規定的程式碼,在一個動作下,無所遁形!

[如何提升系統品質]系列文章連結
前言
StyleCop的rule,主要是針對C#的語言特性所定義出來的。

官網
StyleCop的載點:CodePlex
目前版本:4.6.3,包含了NuGet的套件

使用介紹
安裝完成後,可以直接在Visual Studio中使用。這邊一樣使用PetShop為例:

按下Run StyleCop後,若有違反rule,則會發現在錯誤清單中,多了對應的警告:

與原本Visual Studio一樣,double click該警告,就會移至該檔案該行的程式碼。描述上有說明rule的代碼,以及簡短的敘述這行code為什麼違反了規定。

當在警告上按下『顯示錯誤說明』時,則Visual Studio會自動幫我們打開StyleCop的說明文件。(預設路徑在C:\Program Files (x86)\StyleCop 4.6\Docs)以這個例子來說,Category類別,第32行的程式碼,在if判斷式裡面,沒有使用成對的大括號,而直接return null,違反了我們針對每一個if都要有成對的大括號,且每個大括號需獨立一行的rule。我們可以看到文件上較詳細的說明與範例:

這邊列上一張圖,是目前StyleCop檢測的所有rule:
Document Rules

Layout Rules

Maintainability Rules

Naming Rules

Ordering Rules

Readability Rules

Spacing Rules

如果針對已存在的系統進行檢測,專案中有一些domain term已經當作prefix使用,想要避免匈牙利命名法檢查,可以透過設定白名單來避免程式碼需大改:

另外,當自訂出較符合團隊的規則集後,該設定檔可以在不同的專案之間共享,其設定檔預設路徑在:
C:\Program Files (x86)\StyleCop 4.6\Settings.StyleCop

結論
透過StyleCop的輔助,只要一個按鈕的動作,就可以幫助我們抓出不符合規範的程式碼。讓我們再進行code review的時候,有更多的時間,可以更專注在重點事物上,而不是一般的code convention上。甚至透過CI的簽入原則,可以讓版本庫的程式碼避免受到污染,只有通過原則檢查的程式碼可以簽入。也可以在CI的自動建置報表上,看到相關的檢測數據。

補充工具
建議可以到Visual Studio Gallery上面,下載StyleCopFixer這個Addin,(只支援VS2010),他可以快速地幫助我們修復一些簡單的規則,清單如下:
SA1001
SA1516
SA1513
SA1508
SA1507
SA1505
SA1309
SA1210
SA1202
SA1200
SA1106
SA1101
SA1025
SA1013
SA1012
SA1009
SA1008
SA1633
SA1003
SA1005
SA1600 (for properties only)
SA1121

安裝完使用方式相當簡單,在警告上面按滑鼠右鍵,就會有Fix It可以選,選了後StyleCopFixer自動訂正。

這邊支援的rule有限,有另一個SubMain這家公司出的工具:CodeIt.Right(需付費使用),也可以幫忙做自動檢測以及自動訂正跟半自動訂正的動作,算是更進階的品質檢測兼自動校正的工具,有興趣的朋友可以自行去官網參考。

by the way, SubMain這家公司的工具都挺不錯的,包括免費的GhostDoc也是他們家出的。


上一篇
[如何提升系統品質-Day16]Code Convention
下一篇
[如何提升系統品質-Day18]品質量測工具-FxCop
系列文
如何提升系統設計品質 - 技術與工具以.NET為例30

尚未有邦友留言

立即登入留言