《EJB Apply》由会员分享,可在线阅读,更多相关《EJB Apply(16页珍藏版)》请在金锄头文库上搜索。
1、Visutal Studio 2010 程式碼品質的改善程式碼品質的改善Part 2程式碼剖析、程式碼度量、程式碼分析與簽入程式碼剖析、程式碼度量、程式碼分析與簽入原則原則1 前言前言程式碼剖析(Code Profiling)、程式碼度量(Code Metrics)、程式碼分析(Code Analysis)這些工具都可以協助我們找出程式碼的不同面向的潛在問題,簽入原 則(Check-in Policy)則是一個品質管制關卡,在開發人員交付他們的產出前,由 Team Foundation Server 為我們做最後一道把關。2 程式碼剖析工具程式碼剖析工具Visual Studio 2010 程
2、式碼剖析工具(Code Profiling)可以分析我們的程式碼, 找出可能的效能瓶頸所在,並可進行各種可行的解決方案效能比較,以找出最 佳效能改善方案。2.1 如何使用最忙碌路徑找出效果瓶頸步驟如何使用最忙碌路徑找出效果瓶頸步驟當我們發現程式執行效能不彰時,就可以使用此工具幫我們找出可能的問 題所有。筆者展示的範例是一個四則運算網頁應用程式,使用的是 Code Dom 方式來做到動態四則運算效果,運算結果會輸出至檔案,但我們發現效能不彰, 所以我們想使用 Visual Studio 程式碼剖析工具(Profiling)來找出問題。步驟:請將” 05 Hot Path Copy of Begi
3、n”目錄內容複製並覆蓋”Begin”目錄。請開啟” 05 Hot Path Begin”目錄之 DemoHotPath.sln啟動效能剖析精靈,選擇 Menu - 分析 - 啓動效能精靈,並選擇第二選項”檢測”。圖 選擇”檢測”方法選擇第一選項,即在方案裡的所有專案。圖 選擇目前專案接下來詢問是否啓用”階層互動分析”與”分析 JavaScript”,請按下一 步鈕直接略過。按完成鈕後即完成程式碼剖析設定,被監控程式即開始執行,即時在 Visual Studio 裡會增加效能總管視窗,後續您可以透過它執行程式 剖析工作。圖 效能總管視窗圖 四則運算範例程式開始執行請依此程式執行步驟操作,按Eva
4、luate鈕以進行運算,然後關閉 Internet Explorer,表示程式執行完畢,此時 Visual Studio 會依據我們 的執行步驟進行分析,會產出一份檢測分析報告。在檢測分析報告裡下移至最忙碌路徑區段,會發現執行瓶頸在 Evaluate鈕。圖 檢測分析報告之最忙碌路徑區段請點選”_Default.ButtonEvaluate_Click()”方法,以檢視此方法的細部分析,如下圖,在”這個函式所呼叫的函式(Functions called by this function)”區段中,花費最多時間的是 IEvaluator.Evaluate()方法,表示 它即是效能瓶頸。圖 檢視呼叫
5、方法的細部分析2.2 如何使用比較效能報告步驟如何使用比較效能報告步驟當程式效能瓶頸已界定出來,我們嘗試新的解決方法,此時需要評估新的 解決方案是否達到預期效果。範例是一個四則運算網頁應用程式,原來使用的 是 Code Dom 方式來做到動態四則運算效果,並將運算結果會輸出至檔案,但 我們發現效能不彰問題在於 Code Dom 方法,所以我們採用新的解決方案使 用 Jscript。透過比較效能報告,Visual Studio 能夠提供客觀、詳細的資訊以評估 新舊方案的差異。步驟:延續上一個範例,請開啓”DemoComparison”網站之 Default.aspx,將 ButtonEvalua
6、te_Click 方法程式碼更改如下,換成使用 Jscript 進行動態 運算:protected void ButtonEvaluate_Click(object sender, EventArgs e)/IEvaluator evaluator = new Evaluator1();IEvaluator evaluator = new Evaluator2();double result = evaluator.Evaluate(this.TextBoxExpression.Text);this.TextBoxResult.Text = result.ToString();編譯成功後,再重
7、新產生一次檢測分析報告,在效能總管按啓動分析鈕,將應用程式重新執行一遍。完成後在效能總管就會有兩份檢測分析報 告。圖 產生兩份檢測分析報告請同時選擇此兩份報告,按右鍵選”比較效能報告”,即可產生比較效 能報告,在”比較選項” 區段之“資料行”請選擇”整體專有時間”,臨界 值輸入”1000”,以濾掉影響不大的函式,然後按套用以重新計算。注意!預設 Column 為” 整體專有時間%”,但是因為範例過於簡單,效能 變化的幅度依整體應用程式執行時間來算比例太少,所以才需採用”整體 專有時間”進行比較。注意!由下圖可得知,第二份報告多呼叫了一些新的方法,合計約增加時 間”30,000”,但是少呼叫一些
8、舊方法,合計約減少時間”230,000”,所以新 方案有明顯提昇效能。圖 比較效能報告3 程式碼度量程式碼度量程式碼度量(Code Metrics)是一組軟體度量項目(Measures),可以協助開發 人員對自己所發展的程式碼能有更進一步的了解,透過 Code Analysis(FxCop)引 擎掃描 .exe 或 .dll 檔,依據已定義的度量項目進行計算,讓我們能透過這些 數據可以客觀地了解我們的程式碼的可能潛在那些維護上的問題。當我們有了 這些數據,就能進一步儘早採取行動那些類別或方法需要重整或更多的測試, 讓開發團隊能及早找出潛在風險。步驟請透過 Visual Studio 2010
9、開啟範例:06 Code MetricsDemoCodeMetrics.sln。點選 Menu - “分析” - “計算 DemoCodeMetrics 的程式碼度量”,執 行完畢會產生如下報表。圖 程式碼度量報表裡面包含 6 欄,第一欄階層架構顯示專案階層,由專案 - 命名空間 (Namespace) - 類別(Class) - 方法(Method)。第三欄循環複雜度表示程式邏輯複雜程度,如 if, while, for 廻圈皆算是, 請開啟 Utility.cspublic void ParseCommandLine(string arguments) /1if (arguments.Le
10、ngth = 0) /2this.ShowHelp();throw new UtilityErrorException(“Arguments is illegal!“);for (int i = 0; i 1 & File.Exists(argumentsi+1) /6,7以下略1:Method 進入點算 1 點。2:if 條件敘述算 1 點。3:for 廻圈算 1 點。4,5: if else 條件敘述看有多少 if 就算幾點。6,7:if 條件敘述中有呼叫其他 Method 也算。第四欄繼承深度,所有類別皆需繼承 Object Class,所以最小值為 1,如下 圖 VIPCustomer
11、 繼承 MemberCustomer;MemberCustomer 繼承 Customer,所以 VIPCustomer 之 Depth of Inheritance 值為 3。圖 VIPCustomer 繼承關係第五欄類別結合程度(Class Coupling),表示此類別引用到多少其他類別, 如 Utility Class 有使用到 UtilityErrorException 所以得到數值為 2。第六欄程式碼行數,顧名思義就是程式碼行數,扣除註解,縮排問題,所 得到的實際有作用的程式碼行數。上述皆為基礎度量(Base Measure),現在回到最複雜的第二欄可維護性指 數(Maintain
12、ability Index)是衍生度量(Derived Measure),是由上述欄位計算得 來的,它代表的意義如下表:注意!基礎度量(Base Measure)表示此度量資訊的收集是直接的,不需要額外 的運算過程,而衍生度量(Derived Measure)則表示此度量定義,是由其他的基 礎度量運算得來的注意!可維護性指數(Maintainability Index)公式是由 SEI 發展出來,公式為 171 - 5.2 * log2(Halstead Volume) - 0.23 * (Cyclomatic Complexity) - 16.2 * log2(Lines of Code)。
13、燈號數值範圍說明綠燈20100高維護性黃燈1019中維護性紅燈09低維護性表 可維護性指數(Maintainability Index)數值意義4 程式碼分析程式碼分析程式碼分析(Code Analysis)運用事先定義的規則來掃描程式碼是否有不符 合之處,這些違反的程式碼雖然可能不會造成應用程式無法執行,但可能存在 安全、效能或維護上的議題。Visual Studio 2010 已內建多組規則集,如測試專 用規則集、發行專用規則集,讀者仍可以依需求客製自己的規則集,後續可與 其他專案成員進行分享。步驟:請將範例程式碼” 07 Code Analysis Copy of Begin”目錄內容複
14、製並覆 蓋”Begin”目錄。請開啟” 07 Code Analysis Begin”目錄之 DemoCodeAnalysis.sln在方案總管選擇”ClassLibrary1”節點,按右鍵選屬性,再點選”程式碼 分析”頁,在規則集區域,請按開啓鈕。圖 在規則集區域,請按開啓鈕請只勾選”Microsoft.Naming”、 ”Microsoft.Performance”兩分類,其餘請 清除,並且在屬性視窗,修改”名稱”與”描述”為”Code Review”,然後 儲存此專案設定,會要求您輸入規則集檔案名稱”CodeReview.ruleset”。圖 勾選您想要的規則圖 修改”名稱”與”描述”屬
15、性回到 ClassLibrary1 專案屬性之程式碼分析設定頁面,透過”規則集”之 下拉選單,選擇”瀏覽”項目,選擇適才存檔之 CodeReview.ruleset 規 則集。勾選”建置時啓用程式碼分析”,意指專案進行編譯時會一併進行程式 碼分析,然後按存檔鈕。圖 選擇”Code Review”規則集與勾選”建置時啓用程式碼分析”此時本專案會套用新的規則集,若要方案裡的專案皆套用同一規則集, 請選擇 Menu - 分析 - 為方案設定程式碼分析,在右邊窗格會列出 專案,可以一次設定所有專案對應的規則集。圖 一次設定所有專案對應的規則集將專案重新進行編譯動作,會在錯誤清單出現以下警告訊息,如”
16、CA1709”意指程式碼方法名稱不符合命名原則;”CA1820”意指程式碼 寫法效能比較不好,有更佳的寫法。圖 錯誤清單之警告訊息5 簽入原則簽入原則簽入原則(Check-in Policy)可以說是一個自動檢查關卡,在開發人員要將他們的程式碼簽入 Team Foundation Server 版本管控系統之前,必須符合簽入原則 (Check-in Policy),否則不允許簽入,Visual Studio 2010 預設提供下列 4 種原則:組建:要求在建置過程中的錯誤必須在新的簽入之前修復。程式碼分析:要求在簽入之前必須執行程式碼分析。測試原則:要求在簽入之前完成簽入測試。工作項目:要求一或多個工作項目與簽入程式碼建立關聯,筆者 強烈建議使用這個簽入原則,因為一旦有了工作項目與程式碼的 關聯,後續可以回答這些問題:這個工作修改了那些程式碼?某 一段程式碼的修改是為了什麼工作?步驟沿用程式碼分析範