利用程式碼複製品偵測尋找重複程式碼
程式碼複製 為非常類似的程式碼片段。 它們是在開發期間所使用之應用程式的一種常見的物件。 因為您必須尋找及更新多個片段,所以程式複製很難改變您的應用程式。 Visual Studio 可協助您尋找程式碼複製,讓您能重構它們。
您可以找到特定片段複製品,或尋找您方案中所有的複製。 除了尋找直接複製 ,分析工具會尋找在不同片段裡變數和參數的名稱,以及某些重新排列的陳述式。
複製程式碼分析器搜尋在 Visual C# 和 Visual Basic 專案中的程式碼,並複製到 Visual Studio 方案中。
找出特定程式碼片段的複製品。
反白程式碼位於方法或 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>