코드 복제본 검색을 사용하여 중복 코드 찾기

코드 복제본이란 매우 유사한 코드의 개별 조각으로,일정 기간 동안 개발되었던 응용 프로그램에서 일반적으로 나타나는 현상입니다.복제본은 두 개 이상의 조각을 찾아서 업데이트해야 하므로 응용 프로그램을 변경하기 힘들게 만듭니다.

Visual Studio Ultimate 또는 Visual Studio Premium에서는 코드 복제본을 쉽게 찾아서 코드를 리팩터링할 수 있습니다.

특정 조각의 복제본을 찾거나 솔루션의 모든 복제본을 찾을 수 있습니다.복제본 분석 도구는 직접 사본을 찾아낼 뿐만 아니라, 변수 및 매개 변수의 이름이 다르거나 일부 문이 재배열된 조각을 찾을 수 있습니다.

코드 복제본 분석기는 Visual Studio 솔루션 전체의 Visual C# 및 Visual Basic 프로젝트에서 중복되는 코드를 검색합니다.

대부분 일치하는 코드 복제본 분석 결과

특정 코드 조각의 복제본을 찾으려면

  1. 메서드나 get/set 정의 내에서 코드 조각을 강조 표시합니다.

    [!참고]

    필드, 메서드 또는 속성 서명 등 선언이 아닌 문 복제본을 찾을 수 있습니다.

  2. 조각에 대한 바로 가기 메뉴에서 솔루션에서 일치하는 복제본 찾기를 선택합니다.

솔루션에 유사한 메서드나 조각이 이미 있는지 여부를 알고 싶으면 이 메서드를 사용합니다.

솔루션에서 모든 복제본을 찾으려면

  • 분석 메뉴에서 코드 복제본 분석 솔루션을 선택합니다.

이 메서드는 코드를 검토할 때 특히 유용합니다.

[!참고]

10개 이하의 문으로 이루어진 메서드는 이 명령으로 검색되지 않습니다.

결과가 유사성 순서대로 표시됩니다.각 항목을 확장하여 코드 조각을 확인합니다.

조각에 사용된 지역 변수마다 이름이 다른 경우와 일부 문이 삽입되거나 삭제된 경우라도 유사성이 검색됩니다.

복제본을 비교하려면

  1. 코드 복제본 결과 창에서 두 파일을 선택하거나 두 파일을 포함하는 복제본 그룹 하나를 선택합니다.

  2. 바로 가기 메뉴에서 비교를 선택합니다.

이 기능에는 소스 제어에서 버전 비교에 사용되는 것과 동일한 비교 도구가 사용됩니다.변경하려면 도구 메뉴에서 옵션을 선택합니다.소스 제어Visual Studio Team Foundation Server를 확장합니다.사용자 도구 구성을 선택하고 추가를 선택합니다.

특정 파일이나 메서드를 분석에서 제외하려면

  1. 제외할 메서드가 정의된 Visual Studio 프로젝트에 새 XML 파일을 추가합니다.

    파일이 프로젝트의 일부인지 여부는 중요하지 않습니다.프로젝트의 최상위 디렉터리에 있어야 합니다.

  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>      
    

찾을 수 있는 코드 복제본은 어떤 것입니까?

코드 복제본 분석기에서 "니어 미스(near miss)" 복제본을 찾습니다.

코드 복제본은 흔히 개발자가 코드를 복사하고 새 위치에 적용하여 발생합니다.따라서 분석기에서 복제본 찾기가 실패하기 전에 변경 가능한 정도를 쉽게 짐작할 수 있습니다.다음과 같이 수정할 수 있으며, 이 경우 복제본이 여전히 인식됩니다.각각의 경우 지정된 수의 수정 내용 허용치가 있습니다.

  • 식별자의 이름을 바꿉니다.

  • 문을 삽입했다가 삭제합니다.

  • 문을 다시 정렬합니다.

찾을 수 없는 중복문은 어떤 것입니까?

  • 형식 선언은 비교되지 않습니다.예를 들어, 필드 선언 집합이 매우 유사한 두 개 클래스가 있을 경우 이들 클래스는 복제본을 보고되지 않습니다.

    메서드와 속성 정의 문만 비교됩니다.

  • 코드 복제본 분석 솔루션에서는 문 개수가 10개 미만이 메서드에서는 복제본을 찾지 못합니다.

    하지만 짧은 조각에는 솔루션에서 일치하는 복제본 찾기를 적용할 수 있습니다.

  • 토큰이 40% 이상 변경된 조각

  • 프로젝트에 .codeclonesettings 파일이 포함되어 있는 경우 .codeclonesettings 파일의 Exclusions 섹션에 이름이 지정되어 있으면 해당 프로젝트에 정의되어 있는 코드 요소를 검색할 수 없습니다

  • 생성된 코드의 일부 종류:

    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>