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


78

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

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


1
리팩토링은 C ++에서 어렵지만 VS가 Rename allXcode C ++에서와 같은 기능을 추가해야한다고 생각합니다 .
Dylan Czenski

답변:


70

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

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

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


8
아니, 정말 나쁜 링크입니다. 그 남자는 좌절하고 예의 바르지도 않습니다. (한 번 그 남자에게 뻔뻔스럽고 욕설에 대해 연락했는데, 그는 신경 쓰지 않았습니다). 그러나 예, 리팩토링은 분명히 어렵고 (코드 크기에 따라 다름) 초기 설계에 대해 두 번 생각해야합니다.
reder

16
그래서 여기서 우리는 마이크로 소프트가 엄청나게 어려운 작업 을 잘 풀지 못하는 반면, 이클립스 재단은 더 낫다고 말하고 있습니다 . 프로젝트 제약 조건을 위해 VS에서 프로그래밍하지만 변수 이름을 변경해야 할 때 이클립스를 시작합니다 ...
Zac

10
왜 이것이 허용되는 대답입니까? C ++ 코드를 의미 상 의미있는 형식 HAS로 구문 분석하여 컴파일러에서 수행합니다. MS는 분명히 IDE에 포함 된 컴파일러를 소유하고 있습니다. 동일한 구문 분석 코드를 사용하지 않는 이유는 무엇입니까? 파싱이 얼마나 어려운지는 문제가되지 않습니다.

4
작성자가 C ++에 대한 지식이 부족하기 때문에 잘못된 링크입니다. 예를 들어 그는 RVO를 알지 못합니다. 리팩토링 도구는 작성자가 이미 모든 과부하 해결 지옥을 통과 한 Clang API를 사용하려는 경우 매우 간단합니다. 문제는 MSVS에 이러한 API가 없다는 것입니다.
polkovnikov.ph 2014 년

2
Microsoft Visual Studio 2015는 일부 C ++ 코드의 이름을 리팩터링 할 수 있습니다.
aeroson

11

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


Visual Assist X는 매우 훌륭하고 일반적으로 작업을 잘 수행합니다. 그러나 모든 템플릿 메타 프로그램을 얻으면 일부 코드에 손을 댈 수 있습니다.
Doug T.

2
사실입니다. 부스트로 작업 할 때와 같이 몇 층 이상의 템플릿 레이어를 잘 처리하지 못하는 것으로 나타났습니다.
Brian


4

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

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

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

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


4

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

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

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


3

이 문제에 대해 많은 혼란과 혼란이 있습니다. 이 놀라운 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 ++ 리팩터링에서 괜찮은 작업을 수행합니다. 제한은 순전히 대규모 / 거대한 프로젝트에 적용됩니다.



1

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



0

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에 사용하는 리팩토링 도구는 무엇입니까?


-3

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

그리고 위반해서는 안되지만 C ++ 결함에 대한 귀하의 사례 (예 : yosefk)를 지원하기 위해 제공 한 위의 링크가 완전히 의심 스럽습니다. 누군가 "San Franisco"를 요청했을 때 "Los angeles"에게 방향을 제공하는 것과 비슷합니다.

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.