Udostępnij za pośrednictwem


Znajdowanie zduplikowanego kodu za pomocą narzędzia do wykrywania klonu kodu

Klony kodu są osobnymi fragmentami kodu, które są bardzo podobne.Są typowym zjawiskiem w aplikacji, która była w opracowaniu przez pewien czas.Klony sprawiają, że trudno zmienić aplikację, ponieważ trzeba znaleźć i zaktualizować więcej niż jeden fragment.

Program Visual Studio Ultimate lub Visual Studio Premium pomaga znaleźć klony kodu, tak aby można było je refaktoryzować.

Można znaleźć klony określonego fragmentu lub znaleźć wszystkie klony w rozwiązaniu.Oprócz wyszukiwania bezpośrednich kopii narzędzie analizowania klonów kodu może znaleźć fragmenty, które różnią się nazwami zmiennych i parametrów oraz w których niektóre instrukcje zostały inaczej rozmieszczone.

Analizator klonów kodu szuka duplikatów kodu w projektach języków Visual C# i Visual Basic w całym rozwiązaniu programu Visual Studio.

Wynik analizy klonowanie kodu z silną dopasowań

Aby znaleźć klony określonego fragmentu kodu

  1. Wyróżnij fragment kodu w metodzie lub definicji operacji pobierania/ustawiania.

    [!UWAGA]

    Można znaleźć klony instrukcji, ale nie deklaracji, takich jak pola, metody lub podpisy właściwości.

  2. W menu skrótów dla tego fragmentu wybierz polecenie Znajdź pasujące klony w rozwiązaniu.

Tej metody należy użyć, gdy chcesz wiedzieć, czy podobna metoda lub fragment już istnieje w rozwiązaniu.

Aby znaleźć wszystkie klony w rozwiązaniu

  • W menu Analiza wybierz polecenie Analizuj rozwiązanie w poszukiwaniu Klonów kodu.

Ta metoda jest szczególnie przydatna podczas przeglądania kodu.

[!UWAGA]

Metody, które zawierają mniej niż 10 instrukcji, nie są wykrywane przez to polecenie.

Wyniki są prezentowane w kolejności podobieństwa.Rozwiń każdy element, aby zobaczyć fragmenty kodu.

Należy zauważyć, że podobieństwa są wykrywane, nawet jeśli zmienne lokalne, które są używane przez fragmenty, mają różne nazwy, a nawet jeśli kilka instrukcji zostało wstawionych lub usuniętych.

Aby porównać klony

  1. W oknie Wyniki klonów kodu zaznacz dwa pliki lub grupę klonów, która zawiera dwa pliki.

  2. Wybierz opcję Porównaj z menu skrótów.

Ta funkcji używa tego samego narzędzia porównania, które służy do porównywania wersji pod kontrolą źródła.Jeśli chcesz je zmienić, wybierz polecenie Opcje z menu Narzędzia.Rozwiń węzły Kontrola źródła i Visual Studio Team Foundation Server.Wybierz opcję Konfigurowanie narzędzi użytkownika, a następnie opcję Dodaj.

Aby wykluczyć określone pliki lub metody z analizy

  1. Dodaj nowy plik XML do projektu programu Visual Studio, w którym są zdefiniowane metody, które chcesz wykluczyć.

    Nie ma znaczenia, czy plik jest częścią projektu.Musi znajdować się w głównym katalogu projektu.

  2. Zmień rozszerzenie nazwy pliku na .codeclonesettings.

  3. Edytuj zawartość pliku, tak aby wyglądała jak poniższy przykład.

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

Jakie klony kodu zostaną znalezione?

Analizator klonów kodu znajdzie klony „minimalnie chybione”.

Klony kodu często są wynikiem kopiowania kodu przez deweloperów i dostosowywania go do nowej lokalizacji.Dlatego najłatwiej rozważyć stopień zmian, które mogą być wykonane, aby analizator nie znajdował klonu.Następujące modyfikacje mogą być wprowadzane, a klon nadal będzie zostanie rozpoznany.W każdym przypadku istnieje tolerancja określonej liczby takich modyfikacji:

  • Zmiana nazw identyfikatorów.

  • Wstawianie i usuwanie instrukcji.

  • Zmiana kolejności instrukcji.

Jakie duplikaty nie zostaną znalezione?

  • Deklaracje typów nie są porównywane.Na przykład jeśli dwie klasy posiadają bardzo podobne zestawy deklaracji pól, nie będą raportowane jako klony.

    Porównywane są tylko instrukcje w metodach i definicjach właściwości.

  • Funkcja Analizuj rozwiązanie w poszukiwaniu klonów kodu nie znajdzie klonów w metodach, które mają mniej niż 10 instrukcji.

    Jednakże można zastosować opcję Znajdź pasujące klony w rozwiązaniu do krótszych fragmentów.

  • Fragmenty z więcej niż 40% zmienionymi tokenami.

  • Jeśli projekt zawiera plik .codeclonesettings, elementy kodu, które są zdefiniowane w tym projekcie, nie będą przeszukiwane, jeśli są wymienione w sekcji Exclusions pliku .codeclonesettings.

  • Niektóre rodzaje wygenerowanego kodu:

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

    2. Metody InitializeComponent

    Jednakże nie jest to automatycznie stosowane do całego wygenerowanego kodu.Na przykład jeśli szablony tekstowe są używane, można wykluczyć generowane pliki przez nazwanie ich w pliku .codeclonesettings.

Kiedy należy używać analizy klonowania kodu

Znalezienie klonów jest zazwyczaj przydatne w następujących przypadkach:

  • Podczas aktualizowania istniejącego kodu. Podczas naprawiania usterki lub reagowania na zmiany w wymaganiach zwykle zaczyna się od wyszukiwania lokalizacji w kodzie, którą trzeba zmienić.Przed wprowadzeniem zmiany należy wyszukać klony tego segmentu kodu.Jeśli klony zostaną wykryte:

    1. Należy rozważyć, czy istnieje potrzeba wprowadzania tej samej zmiany do każdego klonu.

    2. Należy rozważyć, czy jest to dobra okazja do refaktoryzacji sklonowanego kodu na udostępnioną metodę lub klasę.

  • Oczyszczanie architektury. Pod koniec każdej iteracji użyj opcji Analizuj rozwiązanie w poszukiwaniu Klonów kodu w menu Analiza.

  • Podczas tworzenia kodu. Po napisaniu nowego kodu należy użyć narzędzia, aby znaleźć podobny kod, który już istnieje.

Zastosowanie analizy klonów do dużej bazy kodu

Kod jest często kopiowany między zupełnie oddzielnymi częściami dużego projektu i często jest kopiowany do różnych części organizacji.Z tego powodu klonów należy szukać w tak dużej bazie kodu, jak to tylko możliwe, nie tylko w tymczasowym rozwiązaniu, na którym odbywa się praca.

Aby zastosować analizator klonów kodu na całym drzewie źródeł, należy utworzyć rozwiązanie, które zawiera wszystkie projekty w repozytorium.

PoradaPorada

Należy pamiętać, że projekt może być dołączony w więcej niż jednym rozwiązaniu.Aby analizować wiele projektów w poszukiwaniu klonów kodu, można utworzyć rozwiązanie, które zawiera wszystkie projekty.Nie trzeba usuwać projektów z rozwiązań, za pośrednictwem których są zwykle dostępne.

Kod wygenerowany

Analiza klonów kodu nie działa dobrze z wygenerowanym kodem.Na przykład:

  • Kod generowany z szablonów T4.

    Aby uzyskać więcej informacji o narzędziu T4, zobacz Generowanie kodu i szablony tekstowe T4.

  • Kod generowany z projektanta, takiego jak projektantów interfejsu użytkownika Silverlight lub WPF.

Aby wykluczyć pliki generowane przez szablony T4 z analizy klonów kodu

  1. Umieść szablony w podkatalogu projektu programu Visual Studio.Nazwij go, na przykład GeneratedFiles.

  2. Dodaj nowy plik tekstowy do projektu i zmień jego nazwę i rozszerzenie na t4Exclusions.codeclonesettings.

  3. Zmień zawartość pliku w następujący sposób:

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