快速理解一堆程式碼的方法 - 使用 Visual Studio 2013 的 Code Map 程式碼地圖
註: 內文提及Visual Studio Ultimate已於 2015/3月改名為 Visual Studio Enterprise
各位夥伴們,
當你剛開始接手別人的程式碼,或是維護前人寫的系統,拿到了一堆程式碼,如何快速了解模組間的關連,幫助你很快進入狀況順利接手呢? 有些程式中連註解都沒有,即使有註解也看不懂,另一種情況是看前人留下的系統文件,但,你確定這些文件有更新嗎? Visual Studio Ultimate 2013 中的 Code Map (程式碼地圖) 功能就是來幫助你解決這些問題! 還有除錯一向是開發人員的痛,Code Map 可用圖形化的方式,了解偵錯的Stack及目前跳到哪裏了,這對除錯的容易性有很大的幫助!
本文簡單說明一下 Code Map,若想學習更多可觀看這影片 - 正確的團隊寫碼標準 - 兼顧開發效率及程式碼品質
延伸閱讀 - 再論 Code Map - 在 Visual Studio 中進行圖形化偵錯,找 Bug 更容易
---------------------------------------------------------------------------------------------------
1. 圖形化你的程式碼! 看圖說故事,快速了解程式碼。
您可以在 Visual Studio Ultimate 中對應程式碼的關聯性。 當您建立 Code Map 時,它們會出現在程式碼編輯器旁邊。 這可讓您專注於工作,因為當您工作時,您可以看到您的程式碼位於程式碼對應的位置。
Code Map 會顯示程式碼中的關聯性,並出現在程式碼編輯器旁邊。 綠色箭頭會在程式碼中顯示游標的位置。 您可以在對應上加註解,就和在紙張上加註一樣。
Code Map 有助於避免在大型程式碼基底、不熟悉的程式碼或舊版程式碼當中不知所措。 例如,當您在偵錯時,可能必須查看許多檔案和專案的程式碼。 Code Map 可協助您瀏覽這些程式碼並查看它們之間的關聯性。 您不需要完全記住此程式碼、追蹤檔案或繪製個別的圖表。 如果您必須中斷工作,Code Map 可協助重新整理您正在處理之程式碼的記憶體。
觀看 Code Map 的 Demo : 與 Code Map (Channel 9) 了解複雜的程式碼
使用 Code Map 需求 - 需要使用 Visual Studio Ultimate 2013 版本,才能從程式碼編輯器或從方案總管建立 Code Map。且要分析的方案需為 Visual C# .NET、Visual Basic .NET 或 C++ (有限支援) 的方案。
2. 視覺化的偵錯! 快速找到 bug 並修正。
假設您處理的繪圖程式有 Bug。 若要重現 Bug,您可以在 Visual Studio Ultimate 中開啟方案並按 F5 開始偵錯。
當您繪製線條並且選取 [復原前一次筆觸] 時,在您繪製下一個線條之前都不會發生任何動作。
因此您藉由搜尋 Undo 方法開始調查。 您會在PaintCanvas 類別中找到。
開始製作程式碼地圖
現在您開始對應 undo 方法及其關聯性。 在程式碼編輯器中,您將 undo 方法及其參考的欄位加入至新的 Code Map。 當您建立新的對應時,可能需要一些時間為程式碼編製索引。 這有助於後面的作業更快速執行。
提示 : 加入對應的最後一個項目會以綠色反白顯示。 綠色箭頭顯示指標在程式碼中的位置。 項目之間的箭頭表示不同的關聯性。 您可以藉由檢查對應項目的工具提示取得其相關詳細資訊。 |
---|
從地圖中巡覽和檢查程式碼
若要查看每個欄位的程式碼定義,按兩下對應上的欄位,或選擇欄位並按 F12。 綠色箭頭會在對應中的項目之間移動。 您在程式碼編輯器中的游標也會自動移動。
提示: 您也可以在程式碼編輯器中移動游標來移動對應上的綠色箭頭。 |
---|
了解程式碼之間的關聯性
現在您想知道哪些其他程式碼與 history 及 paintObjects 欄位互動。 您可以將所有參考這些欄位的方法加入至對應。 您可以從對應或程式碼執行此步驟。
變更配置以重新排列關聯性流程,使對應更容易閱讀。 您也可以透過拖曳的方式將項目在對應間移動。
提示: 根據預設,會開啟 [累加配置]。 當您加入新項目時,這會盡可能減少重新排列對應。 若要在每次加入新項目時重新排列整個對應,請關閉 [累加配置]。 |
---|
我們來檢查這些方法。 在對應上,按兩下 [PaintCanvas] 方法,或選擇此方法並按下 F12。 您了解這個方法會將 history 和 paintObjects 建立為空白清單。
現在重複相同步驟來檢查 clear 方法定義。 您了解 clear 會對 paintObjects 和 history 執行某些工作。 然後呼叫 Repaint 方法。
現在檢查 addPaintObject 方法定義。 它也會對 history 和 paintObjects 執行某些工作。 它也會呼叫 Repaint。
檢查地圖找出問題
似乎所有修改 history 和 paintObjects 的方法都會呼叫 Repaint。 但 undo 方法不會呼叫 Repaint,即使 undo 會修改相同的欄位。 因此您認為可以從 undo 呼叫 Repaint 解決這個問題。
如果您沒有對應顯示這個遺漏的呼叫,可能難以發現這個問題,特別是在較複雜的程式碼中。
共用您的探索和後續步驟
在您或其他人修正此 Bug 之前,您可以在對應上記下關於問題和修正方式的附註。
例如,您可以使用色彩加入註解至對應和旗標項目。
如果您有安裝 Microsoft Outlook,您可以用電子郵件將對應傳送給其他人。 您也可以將對應匯出為影像或其他格式。
解決問題並顯示您的作法
若要修正這個 Bug,您必須將對 Repaint 的呼叫加入至 undo。
若要確認您的修正,先重新啟動偵錯工作階段,然後嘗試重現 Bug。 現在選擇 [復原前一次筆觸] 會如您所預期作用,並確認您已進行正確的修正。
您可以更新對應以顯示您所做的修正。
您的對應現在會在 [復原] 和 [重繪] 之間顯示連結。
注意事項 |
---|
當您更新對應時,可能會看到訊息,指出用於建立對應的程式碼索引已更新。 這表示有人變更程式碼,使您的對應與目前的程式碼不符。 這不會阻止您更新對應,不過,您可能必須重新建立對應以確認其符合程式碼。 |
現在您已完成調查。 您藉由對應程式碼成功找到問題並且加以解決。 您還可以利用對應巡覽程式碼、記住您所學到的內容,以及顯示您用於解決問題的步驟。
想學更多嗎? 可參考此學習影片