Zehn Highlights in Visual Studio 2012: #8 Codeduplikate suchen

Der Dotnet-Doktor  –  0 Kommentare

Mehr Infos

Microsofts Entwicklungsumgebung Visual Studio bietet in der Version 2012 eine Reihe schöner neuer Funktionen für die .NET-Programmierer. Feature Nr. 8 ist das Suchen von Codeduplikaten (Code Clone Analysis).

Eine verbreitete Angewohnheit unter Softwareentwicklern ist das "Copy & 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 Premium-Variante jetzt eine Funktion, um Codeduplikate aufzuspüren. Dabei werden die Suchergebnisse als "schwache", "mittlere" und "schwere" Übereinstimmungen klassifiziert.

Die Codeduplikat-Suche wird über das Menü Analyze | Analyze Solution for Code Clone oder die Markierung eines Codeblocks und dann im Kontextmenü Find Matching Clones in Solution aufgerufen.

Die Code Clone Analysis hat eine "mittlere" Übereinstimmung zwischen "BuchungErstellen" und "BuchungLoeschen" gefunden. Es sind nur zwei Zeilen etwas anders.

So ganz ausgereift ist die Funktion 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.

publicvoid Run1()
{
int x = 5;
for (int a = 0; a < x; a++)
{
Console.WriteLine(a);
}
}

publicvoid Run2()
{
int x = 6;
for (int a = 0; a < x; a++)
{
Console.WriteLine(a);
}
}

publicvoid Run3()
{
int x = 7;
for (int a = 0; a < x; a++)
{
Console.WriteLine(a);
}
}

publicvoid Run4()
{
int x = 6;
for (int b = 0; b < x; b++)
{
Console.WriteLine(b);
}
}