如何撰寫VSTS 2008的Custom Rule
在專案中,每個人都有自己寫程式的習慣,
若沒有訂出一套統一個Coding Style標準,
可能會讓之後要維護的人非常辛苦。
然而在訂出標準後,如何讓它實現呢?
除了StyleCop外,Visual Studio Team System 2008也提供Code Analysis,
事先定出一些常用的規則來檢視程式碼,並會提出警告,
當然它也提供選項可讓警告視為錯誤。
從上圖可得知,Code Analysis包含11類共兩百多條規則,
在此我要探討的是與Coding Style最相關的規則-命名規則(Naming Rules)。
若我們的需求範圍多過這些規則,那就撰寫Custom Rules吧!!
在此我將試做一個常數命名必須全部大寫的Custom Rules。
步驟如下:
step1:
下載FxCop。
FxCop是微軟內部的元件,可讓我們自訂VSTS2008的程式碼分析的Custom Rules。
step2:
建立一個類別庫。
step3:
將FxCopSdk.dll和Microsoft.Cci.dll加入參考。
這兩個dll檔會放在C:\Program Files\Microsoft FxCop 1.36這個路徑底下。
step4:
新增一個類別(Class).cs項目。
並using Microsoft.FxCop.Sdk;
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using Microsoft.FxCop.Sdk;
6:
7: namespace CustomRules
8: {
9: public class ConstRule:BaseIntrospectionRule
10: {
11: public ConstRule() :
12: base("ConstRule", "CustomRules.ConstRule",
13: typeof(ConstRule).Assembly)
14: {
15: }
16:
17: public override ProblemCollection Check(Member member)
18: {
19: Field f = member as Field;
20:
21: if (f == null)
22: return null;
23:
24: else
25: {
26: // 判斷是否為Constant
27: if (f.IsLiteral)
28: {
29: bool error = false;
30:
31: foreach (char cha in f.Name.Name.ToCharArray())
32: {
33: //當字元檢查非大寫英文字母則為違反規則
34: //if ((int)cha < 65 || (int)cha > 90)
35: if (!char.IsUpper(cha))
36: {
37: error = true;
38: break;
39: }
40: }
41:
42: if (error == true)
43: {
44: Problems.Add(new Problem(GetResolution(member.Name.Name)));
45: }
46: }
47: }
48:
49: return Problems;
50: }
51: }
52: }
撰寫Custom Rules的重點包括:
1. 必須繼承「BaseIntrospectionRule」類別。
2. 建構式有3個參數:
2-1. Custom Rule的名稱,要和XML設定檔的標籤值一樣。
2-2. XML設定檔名稱,但不包括「.xml」。(就是跟Build出來的dll檔名字一樣)
2-3. 包含此XML設定檔之組件。
3. override檢查方法,那是一個多載函式,包括六種方法:
3-1. Check (ModuleNode module)。
3-2. Check (Resource resource)。
3-3. Check (String namespaceName, TypeNodeCollection types):檢查namespace。
3-4. Check (TypeNode type): 檢查Class、Struct等Type。
3-5. Check (Member member):檢查Method、Property、Field等。
3-6. Check (Parameter parameter)。
4. GetResolution()是從 XML設定檔取得問題的描述,再將問題加入ProblemCollection類別中。
step5:
新增一個XML檔。
標準格式如下面範例:
1: <?xml version="1.0" encoding="utf-8" ?>
2:
3: <Rules FriendlyName="CustomRules">
4:
5: <Rule TypeName="ConstRule" Category="Dot Net" CheckId="Rule1">
6:
7: <Name>ConstRule </Name>
8:
9: <Description>A constant name should start with a letter, use all uppercase letters.</Description>
10:
11: <Url></Url>
12:
13: <Resolution>Constant name '{0}' should use all uppercase letters.</Resolution>
14:
15: <Email></Email>
16:
17: <MessageLevel Certainty="99"> Warning</MessageLevel>
18:
19: <FixCategories> Breaking </FixCategories>
20:
21: <Owner></Owner>
22:
23: </Rule>
24:
25: </Rules>
step6:
記得將XML檔屬性內的建置動作改為「內嵌資源」。
step7:
將Build好的dll檔放到Visual Studio的安裝路徑下就大功告成拉^^~
C:\Program Files\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop \Rules
接著就可以在Code Analysis看到我們剛剛寫的Rule囉!!
step8:
寫一個簡單的範例觀察常數不是大寫時是否會提出警告。
1: using System;
2:
3: namespace WebApplication2
4: {
5: public partial class WebForm2 : System.Web.UI.Page
6: {
7: protected void Page_Load(object sender, EventArgs e)
8: {
9: const double PI=0.3;
10: const double Pi = 0.3;
11: const double pi = 0.3;
12: }
13: }
14: }
果然秀出警告訊息:
第一個Custom Rule測試成功囉:)
參考資料:
http://www.sql-server-performance.com/articles/dev/fxcop_custom_rules_p2.aspx
http://code.msdn.microsoft.com/sourceanalysis
http://msdn.microsoft.com/zh-tw/vsts2008/products/default.aspx
http://msdn.microsoft.com/en-us/library/bb429476(VS.80).aspx