到 2015 2015年 7 月

30 卷數 7

Visual Studio2015 年-分析建築與代碼映射在Visual Studio2015

Blair McGlashan |到 2015 2015年 7 月

為防止積累的技術債務,以及為保持良好的編碼速度,提高您的應用程式的體系結構至關重要。進一步,要快速瞭解潛在的代碼變化是影響的重要的決定是否變化是影響的合理的以及如果是影響的的話,什麼及其可能的成本將是影響的。這兩個目標需要能夠瞭解您的應用程式的結構和分析那裡浮出水面的依賴關係。要解決的第一個目標,通常從頂部工作中,並向下切入。要解決第二個,一般工作從特定的代碼元素中,並向上擴展。

在本文中,我們將展示如何可用於代碼地圖,與Visual Studio2015年企業中的新功能增強:

  • 瞭解.NET 應用程式的總體結構。
  • 分析該體系結構由逐步深入細節浮出水面的依賴關係。
  • 瞭解和分析擬議的變化對代碼的影響通過建立從特定的代碼元素的依賴關係圖。

我們用兩個例子說明。自上而下的體系結構和鑽井,我們使用"羅斯林"代碼庫 (.NET 編譯器平臺)。我們選擇這兩個原因。首先,它是大的所以瞭解總體體系結構並不那麼容易。(事實上,它是如此之大,您通常需要等待幾分鐘,從冷啟動創建初始的圖,而初始生成和索引發生。性能明顯優於與更小的解決方案)。

第二,羅斯林是開源的所以你可以容易地親自嘗試一下。要分析擬議的變化的影響,我們用於實驗樣機從 Microsoft 視覺化積壓在Team Foundation伺服器 (TFS)。這不是公開的但我們也確定你可以用相似的方式,探討 Roslyn 代碼庫中的代碼元素,雖然做的原因所以在這種情況下是不太清楚。

我們使用Visual Studio2015年企業版,可以從下載的 RTM 版本 bit.ly/1JbLA4S

瞭解整體體系結構

我們的出發點是羅斯林解決方案打開在Visual Studio中,和已經建成。去那裡,我們克隆了 Git 倉庫從 HTTPs://github.com/dotnet/roslyn,使用 Git 克隆經驗的Visual Studio,Team 總管視窗的連接選項卡上,然後打開 RoslynLight.sln 解決方案,自動在打開複製的資源庫中找到。然後我們從開發人員命令提示符處為Visual Studio2015年還原生成解決方案所需的 NuGet 套裝程式跑 src\.nuget\NuGetRestore.ps1 腳本。(預設情況下禁用 Windows PowerShell 腳本的執行。啟用腳本執行需要提升的命令提示符。如果你不熟悉 Windows PowerShell,你會發現它容易運行該腳本,通過按右鍵並選擇從 Windows 資源管理器的運行與 PowerShell。)

接下來,我們添加 xunit.runner.visualstudio NuGet 包到解決方案,羅斯林解決方案,是 xUnit 測試,檢測由Visual Studio。最後,我們構建的解決方案 (這可能需要一些時間)。要對此代碼的架構立即理解基地,我們沒有建設從體系結構功能表中的選項選擇生成代碼映射解決方案。這創造了一張地圖,圖中的解決方案結構和專案引用。尤其是,看到引用可説明您瞭解如何將解決方案的各部分相關的方式你只是無法欣賞看解決方案,並將勘探專案引用,以找出很多。

一旦所有的二進位檔案已被編入索引的代碼索引 (本質上是 SQL 資料庫存儲代碼的完整邏輯結構),地圖將轉化為你所看到的在圖 1。新地圖顯示很多富裕的依賴關係,顏色編碼的傳說中 (按一下查看代碼地圖工具列中的切換按鈕),其厚度反映了相關元件之間的依賴關係的程度。例如,一個綠色的連結指示繼承 (和可能的其他屬地) 之間相關專案中的類。暗綠色節點表示測試專案。

架構圖後索引
圖 1 架構圖後索引

在右邊的篩選器可以用於排除不同種類的依賴項。例如,您可能想要查看關係圖中,與所有的測試代碼,隱藏,或隱藏除繼承和實現連結的所有連結。您還可以隱藏通用節點並刪除包含引用的程式集的外部解決方案的任何節點。這使得它容易看到整個產品代碼 (測試不算作產品代碼) 的體系結構存在繼承關係。

例如,看著繼承從與實現關係的根源給你的感覺概念抽象的框架內。你可以看到編譯器框架是底部的一切。編譯器在框架內,核心也是在此基礎上,雖然也有一些似乎源自 CSharp 和 VisualBasic 的層,在核心類是,也許,分層並不十分正確提示。(我們將介紹如何對此進行調查進一步在下一節)。

你可以放大圖進一步探討,地區和甚至選擇一個節點或節點 (control 鍵按一下可以有多個選擇) 探討另一個圖表中使用新的圖,從選擇內容功能表命令。例如, 圖 2 說明了做這框架的編譯器一部分的核心和 CSharp 亞組的結果。為了在頂部有基類型也被應用於結果底部到頂部佈局。

放大的繼承層次結構
圖 2 放大的繼承層次結構

分析依賴關係

你可以清楚地看到在圖 2,核心繼承某些類從 CSharp 和 VisualBasic,是有點吃驚。讓我們看看如何鑽入這進一步來看看什麼原因造成的異常。我們開始選擇依賴項鍊接 (核心和之間 CSharp),選擇在新代碼地圖上顯示貢獻連結。結果顯示在圖 3

結果的鑽進核心和 CSharp 之間的聯繫
圖 3 結果的鑽進核心和 CSharp 之間的聯繫

我們看到一類是在故障,不得不懷疑是否,事實上,VBCSCompiler.exe 專案/程式集真的是核心分組的一部分。也許我們需要重構的解決方案資料夾結構要搬出去。但這種變化之前,我們用代碼映射來探索的潛在影響。回到地圖所示圖 2,我們可以重新啟用連結的所有篩選器,以便看到所有程式集,並編輯該關係圖將從核心的 VBCSCompiler.exe 節點移動到 CSharp,看到影響依賴關係 (見 圖 4)。這似乎當然不會清理的東西,但我們後來發現,Roslyn.Compilers.CompilerServer.UnitTests.dll 也似乎是在錯誤的地方。探索可以繼續本著這種精神。你甚至可以在關係圖中以產生一個更清潔的架構,可以用於告知重構的解決方案資料夾,以及更深層次的重構,如分裂類或程式集之間的介面創建新的組節點。

移動節點在依賴關係探討潛在重構的影響
圖 4 移動節點在依賴關係探討潛在重構的影響

分析擬議的變化的影響

你可以看到如何檢查的體系結構和依賴項的一個代碼庫從上到下,如何能説明你找出依賴關係進一步分析。你也看到如何有效地使用代碼地圖,做這種分析逐步鑽進較低級別的詳細資料。現在我們要改弦易轍,看看如何可以用相同的功能來探索依賴自底向上的方法,從代碼元素開始。尤其是,我們會確定依賴項引用該代碼元素和代碼元素更改時可能會受到影響。

我們的示例顯示從實驗原型代碼從用於視覺化和更改Visual Studio連線或 TFS 使用分層板積壓的微軟。在此示例中,我們想要添加更改直接通過地圖,則需要一個新的枚舉文字 ChangedProperty 枚舉添加工作項的標題的能力。(如果你想要嘗試這與枚舉在羅斯林代碼庫中,您可以使用 Microsoft.CodeAnalysis.LocationKind)。然而,首先,我們想要探討的更改,所以我們在參考 CodeLens 指示器上按一下,然後點擊代碼映射連結顯示的影響。

你可以在結果上的看到圖 5、 提出的所有方法和其他類成員引用 Changed­屬性枚舉以某種方式。此圖顯示的成員在建築方面; 那就是,按類、 命名空間、 程式集和解決方案資料夾。篩選器用於消除解決方案資料夾和程式集,然後更改為從左至右格式的佈局。

引用依賴地圖後隱藏解決方案資料夾和程式集和左到右佈局
圖 5 引用依賴地圖後隱藏解決方案資料夾和程式集和左到右佈局

這張地圖現在可以用來探索可能會受到此更改的代碼的所有領域。不只可以你使用地圖導航代碼 — — 雙點擊一個節點會把你帶到正確的地方的代碼 — — 你也可以使用它來看看在設計模式。那麼,作為圖 5 所示,您可以立即看到方法 SortAndReparent 出現在 StoryMaps.ViewModel 命名空間、 類和任何這些類的代碼快速檢查發現沒有代碼更改所需。然而,當你看著 WorkItemsWriter 類中的過程方法,您可以立即看到從關係圖中,它在呼喚到子流程,一個為 ChangedProperty 枚舉中的每個文本。添加一個新的文字很可能意味著一種新的子流程方法將需要。代碼檢查證實此 s­­­­­­­­uspicion。

當你經歷這個過程,你可以使節點綠色、 紅色或其他顏色來指示是否需要採取後續行動 (使用內容功能表中的編輯子功能表 |標記為後續),以及將注釋添加到包含更多詳細資訊的關係圖 (見圖 6)。

注明引用的依賴關係圖
圖 6 注明引用的依賴關係圖

總結

瞭解您的應用程式的體系結構是重要的並因此知道任何潛在的代碼變化的影響。

在這篇文章,我們展示了如何使用代碼地圖,使用在Visual Studio到 2015 年,新的功能增強,瞭解和分析您的.NET 應用程式的總體結構,檢查依賴關係在高水準。這些功能包括:

  • 從一個解決方案,使用解決方案資料夾提供初始分組的節點,並根據它們的類型樣式專案節點生成大大改善的頂級圖。
  • 創建新代碼的能力將從現有的地圖選擇映射。
  • 節點和連結特別過濾篩選測試和不同類型的連結的能力。

我們然後顯示如何鑽入依賴項鍊接,在Visual Studio2015年要使用的連結篩選器,可以快速提高挖掘的不必要的依賴性,就到哪裡介紹了依賴項的程式碼的原因。

最後,我們展示了如何你可以採取自底向上方法與代碼映射,通過探索從參考 CodeLens 指標從特定的代碼元素,創建依賴關係圖,然後使用注釋和標記在該圖中記錄結果的分析進行更改的影響,揭示建議的代碼更改的影響。


Stuart Kent 是一組程式經理在微軟負責開發商Visual Studio和Visual Studio的經驗線上,專注于控制技術債務和代碼共用和協作。這包括架構分析工具,CodeLens 和代碼搜索方面。

Jean-Marc Prieur 是高級專案經理,微軟設想和駕駛的Visual Studio和Visual Studio線上經驗交付集中控制技術的債務,包括體系結構分析工具。

Blair McGlashan 是工程部經理領導總部設在英國劍橋的團隊體驗專注于技術的債務,包括體系結構分析工具。