Suchen von doppeltem Code mit der Codeklonerkennung

Codeklone sind separate Fragmente des Codes, die sehr ähneln.Sie sind ein allgemeines Phänomen in einer Anwendung, die momentan für einige Zeit war. Klone machen es schwierig, die Anwendung zu ändern, da Sie mehr als ein Fragment suchen und aktualisieren müssen.Visual Studio kann Ihnen helfen, Codeklone zu suchen, damit Sie sie gestalten können.

Sie können entweder die Klone eines bestimmten Fragments suchen, oder suchen Sie alle Klone in der Projektmappe.Zusätzlich zum Ermitteln von direkten Kopien, kann das Klonanalysetool Fragmente suchen, in denen in Namen von Variablen und Parametern unterscheiden, und, in welchen Anweisungen neu angeordnet wurden.

Die Codeklon-Analysatorsuchen für doppelten Code in Visual C# und Visual Basic-Projekte in der Visual Studio-Projektmappe.

Ergebnis der Codeklonanalyse mit starken Übereinstimmungen

So Klone eines bestimmten Codefragments suchen

  1. Heben Sie ein Fragment des Codes innerhalb einer Methode oder einer get/Satzdefinition hervor.

    HinweisHinweis

    Sie können Klone von Anweisungen, jedoch nicht von Deklarationen wie Feld, von Methode oder von Signaturen der Eigenschaft suchen.

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

Verwenden Sie diese Methode, wenn Sie wissen möchten, wenn eine ähnliche Methode gibt oder bereits im Vorhandensein in der Projektmappe fragmentieren.

Um alle Klone in einer Projektmappe suchen

  • Klicken Sie im Menü Analysieren wählen Sie Projektmappe für Codeklone analysieren aus.

Diese Methode ist besonders nützlich, wenn Sie den Code überprüfen.

HinweisHinweis

Klone, die kleiner sind, als 10 Anweisungen lang werden nicht durch diesen Befehl ermittelt.

Die Ergebnisse werden in der Reihenfolge der Ähnlichkeit dargestellt.Erweitern Sie jedes Element, um die Codefragmente anzuzeigen.

Beachten Sie, dass Ähnlichkeiten erkannt werden, auch wenn die lokalen Variablen, die durch die Fragmente verwendet werden, andere Namen haben und wenn einige Anweisungen eingefügt oder gelöscht wurden.

So Klone vergleichen

  1. Im Fenster Codeklonergebnisse wählen Sie die zwei Dateien oder eine Klongruppe aus, die zwei Dateien enthält.

  2. Wählen Sie Compare im Kontextmenü aus.

Diese Funktion wird dasselbe Vergleichstool, wie für das Vergleichen von Versionen unter Quellcodeverwaltung verwendet wird.Wenn Sie sie ändern möchten, wählen Sie Optionen vom Menü Tools aus.Erweitern Sie Quellcodeverwaltung und Visual Studio Team Foundation Server.Wählen Sie Benutzertools konfigurieren und dann Hinzufügen aus.

Um bestimmte Dateien oder Methoden aus der Analyse ausschließen

  1. Fügen Sie eine neue XML-Datei dem Visual Studio-Projekt hinzu, in dem die Methoden, die Sie ausschließen möchten, definiert werden.

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

  2. Ändern Sie die Dateinamenerweiterung in .codeclonesettings

  3. Bearbeiten Sie den Inhalt der Datei, sodass sie dem folgenden Beispiel ähnelt.

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

Der Code klont wird gefunden?

Der Codeklonanalyzer sucht "Beinahfehlschlag" Klone.

Codeklone ergeben sich häufig von Entwicklern, die Code kopieren und ihn dann die neue Position anpassen.Daher ist es am einfachsten, den Grad der Änderung zu berücksichtigen, der ausgeführt werden kann, bevor der Analyzer den Klon gefunden.Die folgenden Änderungen können ausgeführt werden, und der Klon wird weiterhin erkannt.In beiden Fällen gibt es eine Toleranz einer bestimmten Anzahl von solchen Änderungen:

  • Benennen Sie Bezeichner.

  • Fügen Sie ein und löschen Sie Anweisungen.

  • Ordnen Sie Anweisungen neu.

Hh205279.collapse_all(de-de,VS.110).gifWelche Duplikate werden nicht gefunden?

  • Typdeklarationen werden nicht verglichen.Wenn beispielsweise zwei Klassen mit sehr ähnlichen Sätzen Fügen aufweisen, werden sie nicht als Klone gemeldet.

    Nur Anweisungen in den Methoden und in den Eigenschaftendefinitionen werden verglichen.

  • Projektmappe für Codeklone analysieren findet keine Klone, die weniger als 10 Anweisungen lang sind.

    Sie können jedoch Übereinstimmende Klone in Projektmappe suchen zu den kürzeren Fragmenten anwenden.

  • Fragmente mit mehr als 40% geänderten Token.

  • Wenn ein Projekt eine .codeclonesettings Datei enthält, werden Codeelemente, die in diesem Projekt definiert sind, nicht gefunden, wenn sie Exclusions im Abschnitt der Datei .codeclonesettings benannt werden.

  • Einige Arten von generierter Code:

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

    2. InitializeComponent-Methoden

    Dennoch wird dies nicht automatisch auf allen generierten Code.Wenn Sie beispielsweise Textvorlagen verwenden, sollten Sie die generierten Dateien ausschließen, indem Sie sie in einer Datei .codeclonesettings benennen.

Wann Codeklonanalyse verwendet

Klone zu suchen ist in folgenden Fällen in der Regel nützlich:

  • Wenn der vorhandene Code aktualisiert wird. Wenn Sie einen Fehler beheben oder auf Änderungen der Anforderungen reagieren, starten Sie normalerweise, indem Sie die Stelle im Code suchen, den Sie ändern müssen.Bevor Sie die Änderung vornehmen, Suche für Klone dieses Codesegments.Wenn Klone ermittelt werden:

    1. Ermitteln Sie, ob Sie die gleiche Änderung an jedem Klon vornehmen müssen.

    2. Beachten Sie auch, ob dies eine gute Möglichkeit ist, den geklonten Code in eine freigegebene Methode oder in eine Klasse umzugestalten.

  • Architekturbereinigung. Gegen Ende jeder Iteration, verwenden Sie Projektmappe für Codeklone analysieren auf dem Menü Analysieren.

  • Wenn Sie Code erstellen. Wenn Sie neuen Code geschrieben haben, verwenden Sie das Tool, um ähnlichen Code zu suchen, der bereits vorhanden sind.

Anwenden von Klonanalyse zu einer großen CodeBase

Code wird häufig zwischen durchaus einzelne Teile eines großen Projekts kopiert und wird häufig an verschiedene Teile einer Organisation kopiert.Sie sollten nach Klonen im so großen daher suchen eine CodeBase, wie möglich, nicht nur in der aktuellen Projektmappe, auf der Sie arbeiten.

Um den Codeklonanalyzer über der Quellstruktur anzuwenden, erstellen Sie eine Projektmappe die alle Projekte im Repository enthält.

TippTipp

Beachten Sie, dass Sie ein Projekt in einer Projektmappe einschließen können.Um mehrere Projekte für Codeklone zu analysieren, können Sie eine Projektmappe erstellen die alle Projekte enthält.Sie müssen nicht, um die Projekte von Projektmappen zu entfernen, durch die normalerweise auf sie zugegriffen werden.

Generierter Code

Codeklonanalyse eignet sich mit generiertem Code.Beispiel:

  • Code generiert von den T4-Vorlagen.

    Weitere Informationen über T4 finden Sie unter Codegenerierung und T4-Textvorlagen.

  • Code wird von einem Designer wie den Silverlight- oder WPF-Benutzeroberflächendesignern.

Um die Dateien, die vom T4-Vorlagen aus Code auszuschließen generiert werden klonen Sie Analyse

  1. Speichern Sie die Vorlagen in einem Vorverzeichnis des Visual Studio-Projekts.Nennen Sie es beispielsweise GeneratedFiles.

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

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

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