Eine verbreitete Angewohnheit unter Softwareentwicklern ist das „Copy-and-Paste-Development“: Man kopiert vorhandene Programmcodepassagen, um sie an anderer Stelle (leicht modifiziert) wiederzuverwenden. Dabei könnte man doch sicherlich in vielen Fällen durch eine Parametrisierung, eine Unterroutine oder Vererbung die Codeduplizierung vermeiden. Visual Studio 2012 bietet ab der Premiumvariante jetzt eine Funktion, um Codeduplikate aufzuspüren. Dabei werden die Suchergebnisse als „schwache“, „mittlere“ und „schwere“ Übereinstimmungen klassifiziert. Die Codeduplikatsuche wird aufgerufen über das Menü Analyze | Analyze Solution for Code Clone oder die Markierung eines Codeblocks und dann im Kontextmenü Find Matching Clones in Solution.
So ganz ausgereift ist die Funktion jedoch noch nicht. Die folgenden frappierenden Übereinstimmungen werden nicht gefunden, wenn man Analyze | Analyze Solution for Code Clone wählt, sondern nur wenn man einen der Blöcke anwählt und dann Find Matching Clones in Solution aufruft. In C# werden Run2() und Run3() als Strong Match angezeigt. Run4() wird aber gar nicht moniert, obwohl hier nur die Laufvariable anders heißt. Bei dem gleichen Programmcode in Visual Basic wird Run4() als Medium Match gefunden. Listing 1 zeigt ein Beispiel für Code Clone Analysis.
Listing 1
public void Run1() { int x = 5; for (int a = 0; a < x; a++) { Console.WriteLine(a); } } public void Run2() { int x = 6; for (int a = 0; a < x; a++) { Console.WriteLine(a); } } public void Run3() { int x = 7; for (int a = 0; a < x; a++) { Console.WriteLine(a); } } public void Run4() { int x = 6; for (int b = 0; b < x; b++) { Console.WriteLine(b); } }