Почему в Visual C ++ отсутствует функциональность рефакторинга? - PullRequest
78 голосов
/ 12 декабря 2008

При программировании на C ++ в Visual Studio 2008, почему нет такой функциональности, как в меню рефакторинга при использовании C #?

Я постоянно использую Переименование , и вы действительно скучаете по нему, когда его там нет. Я уверен, что вы можете получить плагины, которые предлагают это, но почему он не интегрируется в IDE при использовании C ++? Это связано с тем, что C ++ должен быть проанализирован?

Ответы [ 11 ]

70 голосов
/ 12 декабря 2008

Синтаксис и семантика C ++ делают невероятно трудным для правильной реализации функций рефакторинга. Можно реализовать что-то относительно простое, чтобы покрыть 90% случаев, но в оставшихся 10% случаев это простое решение ужасно сломает ваш код, изменив то, что вы никогда не хотели менять.

Прочитайте http://yosefk.com/c++fqa/defective.html#defect-8, чтобы кратко обсудить трудности, с которыми приходится сталкиваться при рефакторинге кода в C ++.

Microsoft, очевидно, решила использовать эту особенность для C ++, предоставив сторонним разработчикам делать то, что они могут.

11 голосов
/ 12 декабря 2008

Я не уверен, почему это так, но существуют сторонние инструменты, которые помогают. Например, сейчас я оцениваю Visual Assist X (от Whole Tomato). Мы также используем Visual Studio 2005.

5 голосов
/ 18 декабря 2008

devexpress обеспечивает надстройку Refactor! для C ++ для VS2005 и VS2008.

4 голосов
/ 25 октября 2013

Eclipse делает несколько рефакторингов c ++, включая 'переименование'. Проверьте этот вопрос здесь, на StackOverflow.

Также возможно использовать компилятор Microsoft с Eclipse. Проверьте здесь .

Попробуйте Eclipse и посмотрите, подходит ли он вам.

4 голосов
/ 12 декабря 2008

Не смущайтесь, в VB.Net этого тоже нет:)

C ++ - это HARD-язык для анализа по сравнению с C # (VB тоже, если вы не включили Option Explicit и Option Strict, трудно сказать точно, что делает какая-либо строка кода из НАМНОГО большего контекста ).

По-видимому, это может быть связано с "сложностью" его предоставления.

P.S. Я пометил свой ответ как вики сообщества, потому что я знаю, что он не предоставляет никакой полезной информации.

3 голосов
/ 14 апреля 2014

Существует много недоразумений и путаницы вокруг этой проблемы. Это удивительное видео на YouTube должно прояснить, почему рефакторинг C ++ труден: https://www.youtube.com/watch?v=mVbDzTM21BQ

tl; dr Google проводит рефакторинг всей своей кодовой базы C ++ на 100 миллионов строк, используя компилятор (Clang + LLVM), который разрешает доступ к его промежуточному формату.

Суть в том, что здесь присутствуют сторонние разработчики, для них нет реалистичного способа реорганизовать VS C ++, если только MS не выдаст промежуточные результаты таким же образом. Если вы думаете об этом с точки зрения проблем программирования, это очевидно: для того, чтобы реорганизовать VS C ++, вы должны иметь возможность компилировать C ++ точно так же, как VS делает с теми же ошибками, ограничениями, недостатками, хаки, ярлыками, обходными путями и т. Д. Обычные подозреваемые, такие как Кодеруш и Решарпер, не имеют бюджета для такого безумия, хотя, видимо, они пытаются, но это были годы ...

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

Обновление 2016: Resharper теперь неплохо справляется с рефакторингом C ++. Ограничения только для крупных / гигантских проектов.

2 голосов
/ 15 ноября 2015

MS наконец-то сделала это: https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-33-C-Refactoring-in-Visual-Studio-2015#time=04m37s

Они начали это делать около 10 лет назад, я помню, как смотрел MS Channel 9 очень давно.

1 голос
/ 15 ноября 2009

Я пользуюсь Visual Assist X с Visual Studio около полутора лет. Это невероятный инструмент, который очень вам помогает с обычным кодом C ++, но он не очень хорошо работает с шаблонным кодом. Например, если у вас есть сложный дизайн шаблона на основе политики, он не будет знать, как переименовать переменные, и проект больше не будет компилироваться.

0 голосов
/ 11 мая 2018

Я хотел бы отметить, что Qt Creator (IDE C ++, который совместим с библиотеками VC ++ и системой сборки) обеспечивает переименование символов, которое работает очень хорошо:

Вы можете переименовывать символы во всех файлах проекта. Когда вы переименовываете класс, вы также можете изменить имена файлов, которые соответствуют имени класса.

Qt Creator - Рефакторинг: переименование символов

Функция переименования Qt Creator предоставляет вам список найденных ссылок на символы и возможность исключить любую из них перед выполнением замены. Поэтому, если ссылка на символ неверна, вы можете исключить ее.

Qt Creator Refactor Replace

Таким образом, возможно переименование символа C ++. Приходя в VS из Qt Creator, я чувствую вашу боль до того момента, когда я подумал о том, чтобы преобразовать существующие проекты VS значительного размера, чтобы вместо этого использовать Qt Creator.

Я не покупаю аргумент, что это особенно сложно в C ++. В дополнение к тому факту, что он уже очень хорошо работает в Qt Creator, есть тот факт, что компилятор и компоновщик могут находить и сопоставлять символы: если это было невозможно, вы не могли бы создать свое приложение.

На самом деле, языки вроде Python с динамической типизацией также имеют инструменты переименования. Если вы можете создать такой инструмент для языка, в котором нет явных ссылок на тип переменной, вы определенно можете сделать это для C ++.

Показательный пример:

... Rope, библиотека рефакторинга python ... Я пробовал ее несколько раз, и это определенно сработало, как и ожидалось.

Переполнение стека - Какие инструменты рефакторинга вы используете для Python?

0 голосов
/ 01 июля 2015

Установить плагин, который позволяет вам эту функциональность: https://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...