본문 바로가기

Dev/C++

C++ Refactoring

기 작성되어 있던 C++ 컴포넌트에서 한개의 함수에 너무 많은 코드로 인해,
컴파일러 내부 오류를 경험하고 해당 코드에 대해서 리팩토링을 결심!!

관련된 작업은 Extract Method 이며 자동으로 해당 부분을 추출하여 Method를 만들어 주는 툴을 중심으로 알아 보았다.

이것 저것 알아보던 중 2개의 후보가 눈에 띠었다.
대상은 "Refactor! For Visual C++ 2005"와 "Visual Assist X" 에서 지원하는 Refactoring 에 관련된 기능이다.

결론부터 얘기하면 "Refactor! For Visual C++ 2005"의 기능이 쓸만 하였고 Visual Assist X 의 리팩토링 기능은 간단한 기능을 제외하고는 그다지 유용하지 못하였다.


Visual Assist X
Visual Assist X 는 Visual Studio 에서 코딩에 도움을 주는 유용한 기능이 있는 Add-in 툴로서 최신 버전에는 리팩토링 기능까지 추가가 되었다.

예상했던 대로 속도는 무난히 빨랐으며 간단한 목적으로 사용하기에는 문제가 없으나 몇가지 사항에 대해서는 조심히 사용 해야 될듯하다.

1. Extract Method 의 경우 10개 까지의 파라미터 까지 밖에 지원 하지 않는다.
  - Extract Method의 대상 코드의 파라미터의 지원이 10개까지 밖에 지원하지 않는다
  - 나머지에 대해서는 수작업 신공..

2. Extract Method 의 구문 중 return 이 포함되어 있는 구문에 대해서 별 다른 코드를 넣어주지 않는다.
  - 이것도 나머지는 수작업 신공 -_-;

// 원본코드
bool Run()
{
    int a = 0;
    if (a == -1) {
        return false;
    }

    cout << "next process " << endl;

    a = 10;
    return true;
}

// Extrace Method 후의 코드
bool MyMethod( int a )
{
    if (a == -1) {
        return false;
    }

    cout << "next process " << endl;
}



bool Run()
{
    int a = 0;
    return MyMethod(a);

    a = 10;
    return true;
}


3. Rename 의 경우 바꾸지 못하는 경우 발생
  - 특수한 경우에 구문 분석으로 발견하지 못하여 변경을 못해주는 경우 발생

4. VC++6, VC++2005 버전등 여러 버전 사용 가능
  - 단 VC++6 의 경우 코드 "실행 취소"로 되 돌릴 경우 리팩토링 액션 단위가 아닌 한줄 한줄의 단위로 되 돌리기가 된다.
  - 머 이것도 VC++6 을 안쓰면 되지 머..




Refactor! For Visual C++ 2005

1. 모든 기능적인 부분에서 합격점이지만 속도가 많이 느린 경우 발생
  - 특히 많은 코드에 대해서 리팩토링의 경우 IDE가 뻣었나! 라는 생각이 들 정도로 행이 걸려 있는 상태가 지속
  - 아마도 아래와 같은 UI 부분의 지원 때문에 느리지 않나 생각이 들며 IDE를 처음 로딩할때도 DxCore 라는 모듈을 로딩할때 시간이 좀 걸린다.

refactor1.jpg



2. Visual Assist X 에서 문제였던 코드 중간의 return 부분을 별도의 return 여부를 판단하는 파라미터를 이용하여 처리 해주고 있다.

// 원본코드
bool Run()
{
    int a = 0;
    if (a == -1) {
        return false;
    }

    cout << "next process " << endl;

    a = 10;
    return true;
}


bool RunExtracted(int a, bool &pShouldReturn)
{
    pShouldReturn = false;
    if (a == -1) {
        pShouldReturn = true;
        return false;
    }

    cout << "next process " << endl;
    return false;
}

bool Run()
{
    int a = 0;
    bool lShouldReturn;
    bool lResult = RunExtracted(a, lShouldReturn);
    if (lShouldReturn)
        return lResult;

    a = 10;
    return true;
}


3. Rename 등의 작업을 할때 링크 라는 개념의 함수의 정의, 구현, 호출 부분을 연결된 데이터를 관리하며 UI도 비슷하게 동작을 하는것 같다
  - 허나 UI때문인지 속도 부분에서도 약간 더딘 면이 없지 않아 있다.


4. 무엇보다도 장점인 무료.. 허나 현재는 VC++ 2005만 무난히 적용 되는 것으로 보이며, 
추후에는 더 발전 되어있는 모습으로 더욱 쓸만한 툴이 되지 않을까 생각한다.



결론.

위의 두개의 툴은 그 외에도 많은 리팩토링 기법의 도구를 제공을 하며,
C++의 문법 복잡성에 의해 다른 언어에 비해서 많이 더뎠던 리팩토링 자동화 부분에서 어느정도 해소가 되지 않았나 생각이 든다.

아  이제 C++에서도 리팩토링을 툴로 제공을 하는구나... 흐흐..

앞으로 좀 더 발전을 하면 VC++ 에서도 C#처럼 내장 IDE에서 리팩토링을 제공을 하는 날이 있지 않을까 생각을 한다.



이상 허접한 리팩토링 툴 비교기..

'Dev > C++' 카테고리의 다른 글

C++0x Lambda  (0) 2009.05.20
C++0x 지원 컴파일러 목록  (0) 2009.05.20
C++ Refactoring  (0) 2009.04.14
An Overview of the Coming C++ (C++0x) Standard  (0) 2008.12.29
asio C++ library  (0) 2008.08.22
C++ 0x - Herb Sutter의 블로그 글  (0) 2008.07.29