利用程式碼複製品偵測尋找重複程式碼
「複製程式碼」(Code Clone) 是指非常類似的個別程式碼片段。它們是在應用程式開發期間的某個階段常見的現象。複製程式碼會讓您很難變更應用程式,因為您必須尋找及更新多個片段。
Visual Studio Ultimate 或 Visual Studio Premium 可協助您尋找複製程式碼,讓您能夠重構它們。
您可以尋找特定片段的複製程式碼,或尋找方案中的所有複製程式碼。除了尋找直接複本外,複製程式碼分析工具也可以尋找變數和參數名稱不同的程式碼片段,以及某些陳述式經過重新排列的片段。
複製程式碼分析工具會在您的整個 Visual Studio 方案中搜尋 Visual C# 和 Visual Basic 專案中的複製程式碼。
若要尋找特定程式碼片段的複製程式碼
反白顯示方法或 get/set 定義內的某個程式碼片段。
注意事項 您可以尋找陳述式的複製程式碼,但無法尋找宣告 (例如欄位、方法或屬性簽章) 的複製程式碼。
在程式碼片段的捷徑功能表中,選擇 [在方案中尋找符合的複製程式碼]。
如果您想要知道您的方案中是否已存在類似的方法或程式碼片段,請使用這個方法。
若要尋找方案中所有的複製程式碼
- 在 [分析] 功能表上,選擇 [分析方案中的複製程式碼]。
在檢閱程式碼時,這個方法會特別有用。
注意事項 |
---|
這個命令不會掃描長度小於 10 個陳述式的方法。 |
所得到的結果會以相似度高低的順序來顯示。展開每個項目即可查看程式碼片段。
請注意,即使程式碼片段中使用的區域變數具有不同的名稱,或是插入或刪除了少數幾個陳述式,還是會偵測到相似度。
若要比較複製程式碼
在 [複製程式碼結果] 視窗中,選取兩個檔案或包含兩個檔案的複製程式碼群組。
從捷徑功能表選擇 [比較]。
這個功能所使用的比較工具,和原始檔控制下的版本比較工具相同。如果您想變更比較工具,請選擇 [工具] 功能表中的 [選項]。展開 [原始檔控制] 和 [Visual Studio Team Foundation Server]。選擇 [設定使用者工具],然後選擇 [加入]。
若要從分析中排除特定檔案或方法
將新的 XML 檔案,加入至已定義您想要排除之方法的 Visual Studio 專案中。
檔案是否是專案的一部分並不重要,它必須位於專案的最上層目錄。
將副檔名變更為 .codeclonesettings
編輯檔案的內容,使它類似下面範例。
<CodeCloneSettings> <Exclusions> <!-- Add any combination of the following node types. --> <!-- Absolute or relative path names: --> <File>MyFile.cs</File> <!-- Filepaths may contain wildcards: --> <File>GeneratedFiles\*.cs</File> <!-- Namespace, Type, and FunctionName must be fully qualified: --> <Namespace>MyCompany.MyProject</Namespace> <Type>MyCompany.MyProject.MyClass1</Type> <FunctionName>MyCompany.MyProject.MyClass2.MyMethod</FunctionName> <!-- Names may contain wildcards: --> <Namespace>*.AnotherProject</Namespace> <Type>*.AnotherClass*</Type> <FunctionName>MyProject.*.AnotherMethod</FunctionName> </Exclusions> </CodeCloneSettings>
哪些複製程式碼會被找到?
複製程式碼分析工具會尋找「接近但未造成問題」的複製程式碼。
複製程式碼通常起因於開發人員複製程式碼,然後在新位置加以改寫。因此,考慮可變更的程度,會比讓分析工具找不到複製程式碼來得相對容易。您可以做下列修改,但仍然能夠辨識出此為複製程式碼。這類的修改在每種情況會有個特定的容許數目:
重新命名識別項。
插入和刪除陳述式。
重新排列陳述式。
哪些重複項目不會被找到?
類型宣告不會進行比較。例如,如果有兩個類別具有非常相似的一組欄位宣告,並不會將它們報告為複製程式碼。
只有方法和屬性定義中的陳述式會被加以比較。
[分析方案中的複製程式碼] 不會在長度少於 10 個陳述式的方法中尋找複製程式碼。
不過,您可以將 [在方案中尋找符合的複製程式碼] 套用至較短的程式碼片段。
含有超過 40% 已變更之語彙基元的程式碼片段。
當專案包含 .codeclonesettings 檔案時,如果 .codeclonesettings 檔案的 Exclusions 區段中有指定該專案中所定義的程式碼項目,則不會搜尋這些項目。
產生的程式碼種類:
*.designer.cs, *.designer.vb
InitializeComponent 方法
不過,這並不會自動套用至所有產生的程式碼。例如,如果您使用文字範本,可能需要在 .codeclonesettings 檔案中指定所產生的檔案以便將它們排除。
複製程式碼分析的使用時機
在下列情況下尋找複製程式碼通常很有用:
**更新現有程式碼時。**當您在修正 Bug 或回應變更需求時,通常會從尋找程式碼中需要變更的位置開始。先搜尋該程式碼片段的複製程式碼,再進行變更。如果找到複製程式碼:
考量您是否需要對每個複製程式碼進行相同的變更。
還要考量這是否是將複製程式碼重構為共用方法或類別的好機會。
**清理架構。**在每個反覆項目結束時,使用 [分析] 功能表上的 [分析方案中的複製程式碼]。
**建立程式碼時。**當您撰寫新程式碼時,請使用此工具來尋找已存在的類似程式碼。
將複製程式碼分析套用至大型程式碼基底
在大型專案中,常常會在相當獨立的各部分之間複製程式碼,也經常會複製到組織的不同部分。因此,您應該盡可能在大型程式碼基底中尋找複製程式碼,而不只是在目前正在工作的方案中尋找。
若要將複製程式碼分析工具套用至整個原始檔樹狀結構,請在儲存機制中建立一個包含所有專案的方案。
提示 |
---|
別忘了您可以在多個方案中加入某特定專案。若要對很多專案進行複製程式碼的分析,您可以建立一個包含所有專案的方案。您並不需要從通常用來存取專案的方案中移除這些專案。 |
產生的程式碼
複製程式碼分析不適用於產生的程式碼。例如:
從 T4 範本所產生的程式碼。
如需 T4 的詳細資訊,請參閱 程式碼產生和 T4 文字範本。
從設計工具 (例如 Silverlight 或 WPF 使用者介面設計工具) 產生的程式碼。
若要從複製程式碼分析中排除 T4 範本所產生的檔案
將範本放置在 Visual Studio 專案的子目錄中。為它命名,例如 GeneratedFiles。
將新的文字檔加入至專案,並將它的名稱和副檔名變更為 t4Exclusions.codeclonesettings
變更檔案的內容,如下所示:
<CodeCloneSettings> <Exclusions> <File>GeneratedFiles\*.cs</File> </Exclusions> </CodeCloneSettings>