Почему в Visual C ++ отсутствует функциональность рефакторинга?

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

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

рефакторинг сложен для C ++, но я чувствую, что VS должен добавить Rename allтакую ​​функциональность, как в Xcode C ++.
Dylan Czenski 3.02.2016 16:06:05
11 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

70
12.12.2008 16:50:10
Нет, действительно плохая ссылка. Парень расстроен и даже не вежлив (однажды связался с парнем, по поводу некоторых оскорбительных моментов, ему все равно). Но да, рефакторинг явно сложен (в зависимости от размера кода), и нужно подумать дважды о первоначальном дизайне.
reder 31.01.2012 15:01:37
Итак, здесь мы заявляем, что Microsoft слаба в решении невероятно сложных задач, а Eclipse Foundation лучше? Я программирую в VS для ограничений проекта, но когда мне нужно переименовать переменную, я запускаю Eclipse только для этого ...
Zac 22.04.2013 10:09:52
Почему это принятый ответ? Разбор кода C ++ в семантически значимую форму должен выполняться компилятором. MS, очевидно, владеет компилятором, который включен в их IDE. Почему бы не использовать один и тот же код разбора? На самом деле не имеет значения, насколько сложен синтаксический анализ, потому что они все равно это делают.
Joe 19.04.2014 21:22:39
Это плохая ссылка, потому что автору не хватает знаний C ++. Например, он не знает о RVO. Инструменты рефакторинга довольно просты, если вы собираетесь использовать Clang API, где авторы уже прошли весь этот адский ад, разрешающий перегрузку. Проблема в том, что MSVS не имеет такого API.
polkovnikov.ph 27.10.2014 19:01:15
Microsoft Visual Studio 2015 может рефакторинг переименовать часть кода C ++.
aeroson 6.01.2016 09:31:51

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

11
12.12.2008 16:40:57
Visual Assist X довольно хорош и, как правило, выполняет свою работу довольно хорошо. Тем не менее, если вы получите всю метапрограмму шаблона, он может взяться за ваш код.
Doug T. 18.12.2008 19:24:31
Это правда. Я заметил, что он не очень хорошо справляется с несколькими слоями шаблонов (например, при работе с Boost).
Brian 29.12.2008 22:19:22

Не чувствуйте себя трудным, это не доступно в VB.Net также :)

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

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

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

4
12.12.2008 16:43:15

devexpress предоставляет Рефакторинг надстроек! для C ++ для VS2005 и VS2008.

5
18.12.2008 19:20:52
Однако он больше не поддерживает VS2005.
davidsheldon 14.12.2011 17:10:49

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

1
22.08.2011 12:26:45

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

И обида не будет принята, но я сожалею, что г-н JSB вышеупомянутая ссылка, которую вы предоставили, чтобы поддержать ваше дело (например, yosefk) о дефекте C ++, совершенно не обсуждается. Это больше похоже на то, как вы предоставляете направление «Лос-Анджелесу», когда кто-то спрашивает «Сан-Франциско».

По моему мнению, повышение сложности рефакторинга для определенного языка больше похоже на то, как если бы он указывал на целостность языка. Особенно для языков, которые иногда просто болезненны ... когда дело доходит до объявления и использования их переменных. :) Ладно! скажи мне, почему ты потерял след какого-то узла в дереве узлов ... а? Так что же делать с любым языком, будь это так просто, как машинный код. Вы знаете, что компилятор VS может легко определить, является ли какая-то переменная или подпрограмма мертвым кодом. Понял мою точку зрения?

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

И, конечно, это почти та же база данных, которую IDE использует для всех подобных целей. В прошлый раз компилятор был просто отдельной сущностью, а IDE - просто текстовым редактором с некоторой специализацией, но со временем разрыв между компилятором и редактором IDE становился все меньше, и он непосредственно начал работать с аналогичной проанализированной базой данных. Что позволяет более эффективно обрабатывать все эти интеллектуальные смыслы и рефакторинг или другие проблемы, связанные с синтаксисом. Со всеми прекомпиляциями и JIT-компиляцией этот пробел почти небрежен. Поэтому практически имеет смысл использовать одну и ту же базу данных для обеих целей, иначе ваша потребность в памяти возрастет из-за дублирования.

Вы все программисты, а я нет! И вам, ребята, кажется, трудно представить, как можно реализовать рефакторинг для C ++ или любого языка, который я не могу понять. Речь идет только о том, что вы должны приложить больше усилий для чего-то меньшего в зависимости от того, насколько тяжелым является человек, которого вы пытаетесь подтолкнуть.

Во всяком случае, против хорошей IDE, особенно когда дело доходит до C #.

-3
5.03.2013 10:50:03

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

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

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

4
23.05.2017 11:52:58

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

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

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

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

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

3
15.10.2016 06:19:38

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

0
1.07.2015 07:13:39
Вопрос относится к VS 2008. Этот плагин работает> VS 2013
Kapil Vyas 30.07.2018 20:52:08

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

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

2
15.11.2015 10:20:47

Я хотел бы отметить, что 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
11.05.2018 19:36:32