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

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

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

Анализатор клонов кода находит повторяющийся код в проектах 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>      
    

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

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

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

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

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

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

Hh205279.collapse_all(ru-ru,VS.110).gifКакие повторения не будут найдены?

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

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

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

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

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

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

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

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

    2. Методы InitializeComponent

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

Когда используется анализ клонов кода

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

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

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

    2. Рассмотрим также, возможно ли для данного случая оптимизация клонированного кода в общих методах или классах.

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

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

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

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

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

СоветСовет

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

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

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

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

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

  • Код, созданный конструктором в качестве Silverlight или WPF конструкторов интерфейса пользователя.

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

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

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

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

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