Development Tip

Visual C ++에 리팩터링 기능이없는 이유는 무엇입니까?

yourdevel 2020. 10. 12. 08:17
반응형

Visual C ++에 리팩터링 기능이없는 이유는 무엇입니까?


Visual Studio 2008에서 C ++로 프로그래밍 할 때 C #을 사용할 때 리팩터링 메뉴에 표시되는 것과 같은 기능이없는 이유는 무엇입니까?

저는 Rename을 끊임없이 사용하는데 그것이 없을 때 정말 그리워합니다. 나는 이것을 제공하는 플러그인을 얻을 수 있다고 확신하지만 C ++를 사용할 때 왜 IDE에 통합되지 않습니까? 이것은 C ++를 구문 분석해야하는 방식에 문제가 있기 때문입니까?


C ++의 구문과 의미는 리팩토링 기능을 올바르게 구현 하는 것을 매우 어렵게 만듭니다 . 90 %의 경우를 다루기 위해 비교적 간단한 것을 구현하는 것이 가능하지만 나머지 10 %의 경우 간단한 솔루션이 변경하고 싶지 않은 것을 변경하여 코드를 끔찍하게 깨뜨릴 것입니다.

http://yosefk.com/c++fqa/defective.html#defect-8 에서 C ++의 모든 리팩토링 코드가 처리해야하는 어려움에 대한 간략한 설명을 읽으십시오 .

마이크로 소프트는 C ++를위한이 특정 기능을 활용하기로 결정한 것으로 보이며, 제 3 자 개발자가 할 수있는 일을 할 수 있도록 맡기고 있습니다.


왜 이런지 잘 모르겠지만 도움이되는 타사 도구가 있습니다. 예를 들어, 지금은 Visual Assist X (Whole Tomato)를 평가하고 있습니다. 우리는 또한 Visual Studio 2005를 사용하고 있습니다.


devexpress 는 Add-in Refactor를 제공합니다 ! VS2005 및 VS2008 용 C ++ 용.


힘들게 느끼지 마십시오. VB.Net에서도 사용할 수 없습니다. :)

C ++는 C #과 비교할 때 구문 분석하기 어려운 언어입니다 ( "Option Explicit"및 "Option Strict"가 켜져 있지 않으면 VB도 마찬가지입니다. 훨씬 더 큰 컨텍스트에서 코드 줄이 무엇을하는지 정확히 알기 어렵습니다).

추측으로는 그것을 제공하는 "어려움"과 관련이있을 수 있습니다.

추신 : 유용한 정보를 제공하지 않는다는 것을 알고 있기 때문에 내 답변을 커뮤니티 위키로 표시했습니다.


Eclipse는 '이름 바꾸기'를 포함하여 C ++ 리팩토링을 거의 수행하지 않습니다. 여기 StackOverflow 에서이 질문을 확인하십시오 .

Eclipse와 함께 Microsoft 컴파일러를 사용할 수도 있습니다. 여기에서 확인 하십시오 .

Eclipse를 사용 해보고 자신에게 맞는지 확인하십시오.


이 문제에 대해 많은 혼란과 혼란이 있습니다. 이 놀라운 YouTube 동영상은 C ++ 리팩토링이 어려운 이유를 명확하게 보여줍니다. https://www.youtube.com/watch?v=mVbDzTM21BQ

tl; dr Google은 중간 형식에 대한 액세스를 허용하는 컴파일러 (Clang + LLVM)를 사용하여 전체 1 억 줄 C ++ 코드베이스를 리팩터링합니다.

결론적으로, 제 3자가 여기에 얽매여 있습니다. MS가 중간 결과를 같은 방식으로 출력하지 않는 한 그들이 VS C ++를 리팩토링 할 현실적인 방법은 없습니다. 프로그래밍 문제 관점에서 생각해 보면 이것은 분명합니다. VS C ++를 리팩터링하려면 VS가 동일한 버그, 제한 사항, 결함, 해킹, 바로 가기, 해결 방법 등을 사용하여 정확히 동일한 방식으로 C ++를 컴파일 할 수 있어야합니다. Coderush와 Resharper와 같은 일반적인 용의자는 분명히 노력하고 있지만 몇 년이 지났지 만 그런 종류의 광기에 대한 예산이 없습니다 ...

http://www.jetbrains.com/resharper-cpp/

2016 업데이트 : Resharper는 이제 C ++ 리팩터링에서 괜찮은 작업을 수행합니다. 제한은 순전히 대규모 / 거대한 프로젝트에 적용됩니다.


MS는 마침내 이것을했습니다 : https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-33-C-Refactoring-in-Visual-Studio-2015#time=04m37s

그들은 약 10 년 전에 이것을 시작했고, 나는 오래 전에 ms channel9를 봤던 것을 기억합니다.


약 1 년 반 동안 Visual Studio와 함께 Visual Assist X사용 하고 있습니다. 일반 C ++ 코드로 많은 도움을주는 놀라운 도구이지만 템플릿 코드에서는 잘 수행되지 않습니다. 예를 들어, 정교한 정책 기반 템플릿 디자인이있는 경우 변수 이름을 바꾸는 방법을 알 수 없으며 프로젝트가 더 이상 컴파일되지 않습니다.


해당 기능을 활성화하는 플러그인 설치 : https://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194


Qt Creator (VC ++ 라이브러리 및 빌드 시스템과 호환되는 C ++ IDE)가 매우 잘 작동하는 기호 이름 변경을 제공한다는 점을 지적하고 싶습니다.

프로젝트의 모든 파일에서 기호 이름을 바꿀 수 있습니다. 클래스 이름을 바꿀 때 클래스 이름과 일치하는 파일 이름을 변경할 수도 있습니다.

Qt Creator-리팩토링 : 심볼 이름 바꾸기

Qt Creator의 이름 바꾸기 기능은 찾은 심볼 참조 목록과 교체를 수행하기 전에 제외 할 수있는 기회를 제공합니다. 따라서 기호 참조가 잘못되면 제외 할 수 있습니다.

Qt Creator 리 팩터 교체

따라서 C ++ 기호 이름 변경이 가능합니다. Qt Creator에서 VS로 오면서 저는 기존의 상당한 크기의 VS 프로젝트를 Qt Creator를 대신 사용하도록 변환하는 것을 고려할 때까지 고통을 느낍니다.

나는 이것이 C ++에서 특히 어렵다는 주장을 사지 않는다. Qt Creator에서 이미 잘 작동한다는 사실 외에도 컴파일러와 링커가 기호를 찾고 일치시킬 수 있다는 사실이 있습니다. 이것이 가능하지 않다면 애플리케이션을 빌드 할 수 없습니다.

실제로 동적으로 입력되는 Python과 같은 언어에도 이름 변경 도구가 있습니다. 변수 유형에 대한 명시 적 참조가없는 언어에 대해 이러한 도구를 만들 수 있다면 C ++에서 확실히 수행 할 수 있습니다.

지목 사항:

... Rope, 파이썬 리팩토링 라이브러리 ... 몇 번의 이름 변경을 시도했는데 예상대로 작동했습니다.

Stack Overflow-Python에 어떤 리팩토링 도구를 사용합니까?


모든 전문가의 의견에도 불구하고 리팩토링 지원 문제가 C ++ 언어 의미 체계 또는 해당 문제에 대한 언어 의미 체계와 관련이 있다는 데 전혀 동의하지 않습니다. 컴파일러 빌더 자체가 이유나 제약으로 인해 첫 번째 경우에 하나를 구현하도록 선택하지 않는 것을 제외하고는 가능합니다.

그리고 위반해서는 안되지만 C ++ 결함에 대한 귀하의 케이스 (예 : yosefk)를 지원하기 위해 귀하가 제공 한 위의 링크가 완전히 의문의 여지가 없다고 jsb 씨에게 말씀 드리게되어 유감입니다. 누군가 "San Franisco"를 요청했을 때 "Los angeles"에 방향을 제공하는 것과 비슷합니다.

제 생각에는 특정 언어에 대한 리팩토링 난이도 문제를 제기하는 것은 언어 무결성 자체에 손가락을 올리는 것과 비슷합니다. 특히 변수 선언 및 사용과 관련하여 때로는 고통스러운 언어의 경우. :) 괜찮아! 노드 트리 내의 일부 노드를 어떻게 잃어버린 지 말해봐 ... 따라서 어떤 언어로도 수행되는 작업은 기계 수준 코드만큼 간단합니다. VS 컴파일러는 어떤 변수 나 루틴이 죽은 코드인지 쉽게 감지 할 수 있다는 것을 알고 있습니다. 내 요점은?

타사 도구 개발 정보. 컴파일러 공급 업체가이를 처리하기 위해 모든 구문 분석 데이터베이스를 복제해야하는 타사 도구를 원한다면 훨씬 쉽고 효과적으로 구현할 수 있다고 생각합니다. 요즘 컴파일러는 기계 코드 수준에서 코드를 매우 효율적으로 최적화 할 수 있으며 이전에 일부 변수가 사용 된 방법을 말하기가 어렵다는 말을 들었습니다. 당신은 내가 생각하는 컴파일러의 내부 작업에 실제로 관심을 기울이지 않았습니다. 내부에 보관하는 데이터베이스.

그리고 IDE가 모든 유사한 목적을 위해 사용하는 거의 동일한 데이터베이스인지 확인하십시오. 이전에는 컴파일러가 별도의 엔티티 였고 IDE는 일부 전문화가있는 텍스트 편집기 였지만 시간이 지남에 따라 컴파일러와 IDE 편집기 간의 차이가 줄어들고 유사한 구문 분석 된 데이터베이스에서 직접 작업을 시작했습니다. 이를 통해 모든 지능 및 리팩토링 또는 기타 구문 관련 문제를보다 효과적으로 처리 할 수 ​​있습니다. 모든 사전 컴파일과 JIT 컴파일로 인해이 차이는 거의 소홀합니다. 따라서 두 가지 목적으로 동일한 데이터베이스를 사용하지 않으면 중복으로 인해 메모리 요구량이 높아집니다.

여러분은 모두 프로그래머입니다-나는 아닙니다! 그리고 여러분은 C ++ 또는 제가 이해할 수없는 언어에 대해 리팩토링을 구현하는 방법을 시각화하는 데 어려움을 겪고있는 것 같습니다. 당신이 밀고 자하는 사람이 얼마나 무거운 지에 따라 더 적은 것을 위해 더 많은 노력을 기울여야하는 것에 대한 모든 것입니다.

어쨌든 C #과 관련하여 특히 좋은 IDE VS.

참고 URL : https://stackoverflow.com/questions/363292/why-is-visual-c-lacking-refactor-functionality

반응형