Tipps und Tricks rund um .NET und Visual Studio

Copy-and-Paste-Entwicklung entlarven
Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne „.NETversum“ ihr Expertenwissen rund um .NET-Tools und WPF mit.

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.

Abb. 1: 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 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);   } }
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -