Suchen von doppeltem Code mit der Codeklonerkennung

Codeklone sind einzelne Codefragmente, die nahezu identisch sind.Sie treten häufig in Anwendungen mit langen Entwicklungsphasen auf.Klone erschweren das Ändern von Anwendungen, da hierzu mehrere Fragmente gesucht und aktualisiert werden müssen.

Visual Studio Ultimate oder Visual Studio Premium unterstützen Sie bei der Suche nach Codeklonen, damit Sie diese umgestalten können.

Sie haben die Möglichkeit, die Klone eines bestimmten Fragments zu suchen, oder alle Klone in einer Projektmappe.Mit dem Tool zur Klonanalyse können Sie, zusätzlich zur Suche nach direkten Kopien, nach Fragmenten suchen, in denen sich die Namen von Variablen und Parametern unterscheiden und einige Anweisungen neu angeordnet wurden.

Bei der Codeklonanalyse wird in der gesamten Visual Studio-Projektmappe in Visual C#- und Visual Basic-Projekten nach dupliziertem Code gesucht.

Ergebnis der Codeklonanalyse mit starken Übereinstimmungen

So suchen Sie Klone eines bestimmten Codefragments

  1. Markieren Sie ein Fragment des Codes innerhalb einer Methode oder einer Get-/Set-Definition.

    HinweisHinweis

    Sie können Klone von Anweisungen suchen, jedoch nicht von Deklarationen wie Feld-, Methoden- oder Eigenschaftensignaturen.

  2. Wählen Sie im Kontextmenü für das Fragment Übereinstimmende Klone in Projektmappe suchen aus.

Verwenden Sie diese Methode, wenn Sie wissen möchten, ob die Projektmappe bereits eine ähnliche Methode oder ein ähnliches Fragment enthält.

So suchen Sie alle Klone in einer Projektmappe

  • Wählen Sie im Menü AnalyseProjektmappe für Codeklone analysieren aus.

Diese Methode ist insbesondere beim Überprüfen von Code hilfreich.

HinweisHinweis

Methoden unter einer Länge von 10 Anweisungen werden mit diesem Befehl nicht überprüft.

Die Ergebnisse werden in der Reihenfolge der Ähnlichkeit angezeigt.Erweitern Sie die einzelnen Elemente, um die Codefragmente anzuzeigen.

Beachten Sie, dass Ähnlichkeiten auch dann erkannt werden, wenn die in den Fragmenten verwendeten lokalen Variablen unterschiedliche Namen haben oder einige Anweisungen eingefügt oder gelöscht wurden.

So vergleichen Sie Klone

  1. Wählen Sie im Fenster Codeklonergebnisse eine der beiden Dateien oder eine Klongruppe aus, die zwei Dateien enthält.

  2. Wählen Sie im Kontextmenü den Befehl Vergleichen aus.

Für diese Funktion wird dasselbe Vergleichstool verwendet wie für den Versionsvergleich in der Quellcodeverwaltung.Wenn Sie es ändern möchten, wählen Sie im Menü ToolsOptionen aus.Erweitern Sie die Einträge Quellcodeverwaltung und Visual Studio Team Foundation Server.Wählen Sie Benutzertools konfigurieren und dann Hinzufügen aus.

So schließen Sie bestimmte Dateien oder Methoden von der Analyse aus

  1. Fügen Sie dem Visual Studio-Projekt, in dem die auszuschließenden Methoden definiert sind, eine neue XML-Datei hinzu.

    Es spielt keine Rolle, ob die Datei Teil des Projekts ist.Sie muss sich im obersten Verzeichnis des Projekts befinden.

  2. Ändern Sie die Dateinamenerweiterung in .codeclonesettings.

  3. Bearbeiten Sie den Inhalt der Datei nach dem Muster des folgenden Beispiels.

    <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>      
    

Welche Codeklone werden gesucht?

Der Codeklonanalyzer sucht nach "Beinahe"-Klonen.

Codeklone entstehen häufig, wenn Entwickler Code kopieren und diesen anschließend am neuen Speicherort anpassen.Es ist daher am einfachsten, den möglichen Grad der Änderung zu berücksichtigen, bevor der Analyzer den nicht Klon findet.Bei den folgenden Änderungen wird ein Klon wird weiterhin erkannt.Für jeden Fall wird eine bestimmte Anzahl solcher Änderungen toleriert:

  • Umbenennen von Bezeichnern

  • Einfügen und löschen von Anweisungen

  • Neuanordnen von Anweisungen

Welche Duplikate werden nicht gefunden?

  • Typdeklarationen werden nicht verglichen.Wenn Sie beispielsweise zwei Klassen mit ähnlichen Sätzen von Felddeklarationen haben, werden diese nicht als Klone gemeldet.

    Es werden nur Anweisungen in Methoden und den Eigenschaftendefinitionen verglichen.

  • Mit der Funktion Projektmappe für Codeklone analysieren werden keine Klone in Methoden gesucht, die weniger als 10 Anweisungen enthalten.

    Für kürzere Fragmente können Sie jedoch die Funktion Übereinstimmende Klone in Projektmappe suchen verwenden.

  • Fragmente, in denen mehr als 40 % der Token geändert wurden.

  • Enthält ein Projekt eine .codeclonesettings-Datei, werden die in diesem Projekt definierten Codeelemente nicht durchsucht, wenn sie in der .codeclonesettings-Datei unter Exclusions aufgeführt sind.

  • Einige Arten von generiertem Code:

    1. *.designer.cs, *.designer.vb

    2. InitializeComponent-Methoden

    Dies gilt jedoch nicht automatisch für jeden generierten Code.Wenn Sie beispielsweise Textvorlagen verwenden, sollten Sie generierte Dateien ausschließen, indem Sie diese in einer .codeclonesettings-Datei aufführen.

Verwendungsmöglichkeiten der Codeklonanalyse

Das Suchen nach Klonen empfiehlt sich in den folgenden Fällen:

  • Beim Aktualisieren von vorhandenem Code. Wenn Sie einen Fehler beheben oder auf Änderungen von Anforderungen reagieren, beginnen Sie gewöhnlich mit einer Suche nach der Stelle im Code, die geändert werden soll.Suchen Sie nach Klonen dieses Codesegments, bevor Sie die Änderung vornehmen.Gehen Sie wie folgt vor, wenn Klone gefunden werden:

    1. Überlegen Sie, ob für jeden Klon dieselbe Änderung erforderlich ist.

    2. Wägen Sie zudem ab, ob es sich um eine gute Gelegenheit handelt, den geklonten Code in eine freigegebene Methode oder Klasse umzugestalten.

  • Beim Bereinigen der Architektur. Verwenden Sie gegen Ende jeder Iteration die Funktion Projektmappe für Codeklone analysieren im Menü Analysieren.

  • Beim Erstellen von Code. Wenn Sie neuen Code geschrieben haben, verwenden Sie das Tool, um bereits vorhanden, ähnlichen Code zu suchen.

Anwenden von Klonanalyse auf eine große Codebasis

Code wird häufig aus relativ unabhängigen Teilen eines großen Projekts kopiert und auf verschiedene Firmenbereiche verteilt.Daher sollten Sie bei der Suche nach Klonen eine möglichst große Codebasis verwenden, anstatt nur in der Projektmappe zu suchen, an der Sie derzeit arbeiten.

Um den Codeklonanalyzer auf die gesamte Quellstruktur anzuwenden, erstellen Sie eine Projektmappe für alle Projekte, die sich im Repository befinden.

TippTipp

Beachten Sie, dass ein Projekt in mehreren Projektmappen enthalten sein kann.Um eine hohe Anzahl von Projekten auf Codeklone zu analysieren, können Sie eine Projektmappe erstellen, die alle Projekte enthält.Die Projekte müssen nicht aus den Projektmappen entfernt werden, über die normalerweise auf sie zugegriffen wird.

Generierter Code

Die Codeklonanalyse ist für generierten Code nicht sehr geeignet.Beispiel:

  • Code, der aus T4-Vorlagen generiert wird.

    Weitere Informationen zu T4 finden Sie unter Codegenerierung und T4-Textvorlagen.

  • Code, der mit Benutzeroberflächendesignern wie Silverlight oder WPF generiert wird.

So schließen Sie Dateien aus, die aus T4-Vorlagen generiert werden

  1. Platzieren Sie die Vorlagen in einem Unterverzeichnis des Visual Studio-Projekts.Nennen Sie sie beispielsweise GeneratedFiles.

  2. Fügen Sie dem Projekt eine neue Textdatei hinzu, und ändern Sie den Namen und die Erweiterung zu t4Exclusions.codeclonesettings.

  3. Ändern Sie den Inhalt der Datei wie folgt:

    <CodeCloneSettings>
      <Exclusions>
        <File>GeneratedFiles\*.cs</File>
      </Exclusions>
    </CodeCloneSettings>