Поделиться через


Поиск повторяющегося кода с помощью обнаружения клонов кода

Клоны кода являются отдельными фрагментами кода, которые очень похожи.Это общее явление для приложений, которые уже некоторое время находятся в разработке.Клоны усложняют изменение приложения, так как в данном случае необходимо найти и обновить более одного фрагмента кода.

Visual Studio Ultimate или Visual Studio Premium помогает найти клонов кода, чтобы можно было выполнить их рефакторинг.

Можно найти клонов конкретного фрагмента или найти все клоны в решении.Помимо обнаружения непосредственных копий, средство анализа клонов может найти фрагменты, которые различаются именами переменных или параметров, а также те, в которых изменилось расположение некоторых операторов.

Анализатор клонов кода находит повторяющийся код в проектах Visual C# и Visual Basic в пределах решения Visual Studio.

Результаты анализа кода на наличие клонов со строгими совпадениями

Нахождение клонов указанного фрагмента кода

  1. Выберите фрагмент кода в методе или определении get/set.

    ПримечаниеПримечание

    Можно найти клоны операторов, но не объявлений, например полей, методов или подписей свойств.

  2. В контекстном меню фрагмента выберите Найти совпадающие клоны в решении.

Используйте этот метод, если требуется обнаружить схожие методы или фрагменты в решении.

Нахождение всех клонов в решении

  • В меню Анализ выберите Анализировать решение на наличие клонов кода.

Этот метод особенно полезен при проверке кода.

ПримечаниеПримечание

Данная команда не сканирует методы длиной менее 10 операторов.

Результаты представляются в порядке сходства.Разверните каждый элемент для просмотра фрагментов кода.

Обратите внимание, что обнаруживаются даже те сходства, в которых локальные переменные, используемые во фрагментах, имеют различные имена, а также те, в которых некоторые операторы были вставлены или удалены.

Сравнение клонов

  1. В окне Результаты поиска клонов кода выберите два файла или группу клонов, которая содержит два файла.

  2. Выберите в контекстном меню команду Сравнить.

Эта функция использует средство сравнения, применяемое для сравнения версий в системе управления версиями.Если нужно изменить его, выберите Параметры в меню Сервис.Разверните область Система управления версиями и Visual Studio Team Foundation Server.Выберите Пользовательский инструментарий, а затем нажмите кнопку Добавить.

Исключение определенных файлов или методов из анализа

  1. Добавьте новый XML-файл к проекту Visual Studio, в котором определены методы, которые необходимо исключить.

    Не имеет значения, является ли файл частью проекта.Он должен быть в каталоге верхнего уровня проекта.

  2. Измените расширение имени файла на .codeclonesettings

  3. Измените содержимое файла так, чтобы он выглядел следующем образом.

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

Какие клоны кода будут найдены?

Анализатор клонов кода найдет клонов "минимального промаха".

Клоны кода являются результатом работы разработчиков, которые копируют код, а затем адаптируют его к новому месту.Поэтому простейшим способом нахождения клона является рассмотрение степени изменения кода.Можно произвести следующие изменения, при этом клон все равно будет найден.В каждом случае существует погрешность для таких изменений:

  • Переименование идентификаторов.

  • Вставка и удаление операторов.

  • Изменение порядка операторов.

Какие повторения не будут найдены?

  • Объявления типов не сравниваются.Например, если имеется два класса с очень похожими наборами объявлений полей, они не будут помечены как клоны.

    Сравниваются только операторы в методах и определениях свойств.

  • Команда Анализировать решение на наличие клонов кода не позволяет найти клоны в методах длиной менее 10 операторов.

    Однако можно применить команду Найти совпадающие клоны в решении для анализа более коротких фрагментов.

  • Фрагменты с токенами, более 40 % которых изменены.

  • Если проект содержит файл .codeclonesettings, элементы кода, которые определены в данном проекте, не будут найдены, если они именованы в разделе Exclusions файла .codeclonesettings.

  • Некоторые типы создаваемого кода:

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

    2. Методы InitializeComponent

    Однако это не будет автоматически применяется ко всему сгенерированному коду.Например, если используются шаблоны текста, можно исключить сгенерированные файлы, перечислив их в файле .codeclonesettings.

Случаи применения анализа клонов кода

Обычно нахождение клонов полезно в следующих случаях:

  • При обновлении существующего кода. При исправлении ошибки или при изменении требований обычно начинают с нахождения места в коде, которое необходимо изменить.Перед внесением изменений найдите клонов этого сегмента кода.Если обнаружены клоны:

    1. Оцените, нужно ли внести одинаковые изменения в каждый клон.

    2. Рассмотрите также, можно ли выполнить рефакторинг клонированного кода в общий метод или класс.

  • Архитектурная очистка. В конце каждой итерации используйте команду Анализировать решение на наличие клонов кода в меню Анализировать.

  • При создании кода. При записи нового кода используйте средство для поиска уже существующего схожего кода.

Применение анализа клонов к большой базе кода

Часто код копируется между отдельными частями большого проекта, и часто код копируется для разных подразделений.Поэтому необходимо найти клонов в большой базе кода, а не только в непосредственном решении, с которым ведется работа.

Для применения анализатора клонов кода в масштабах всего дерева исходного кода создайте решение, содержащее все проекты репозитория.

СоветСовет

Помните, что можно включить проект в несколько решений.Для анализа нескольких проектов клонов кода можно создать решение, включающее все проекты.Нет необходимости удалять проекты из решений, через которые обычно осуществляется доступ к ним.

Созданный код

Анализ клонов кода не работает со сгенерированным кодом.Примеры.

  • Код, созданный на основе шаблонов T4.

    Дополнительные сведения о T4 см. в разделе Создание кода и текстовые шаблоны T4.

  • Код, созданный конструктором, например конструкторами ИП Silverlight или WPF.

Исключение файлов, созданных шаблонами T4 из анализа клонов кода

  1. Поместите шаблоны во вложенный каталог проекта Visual Studio.Назовите его, например, GeneratedFiles.

  2. Добавьте новый текстовый файл в проект и измените его имя и расширение на t4Exclusions.codeclonesettings

  3. Измените содержимое файла следующим образом:

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