Почему Visual C++ не хватает функций рефакторинга?
при программировании на C++ в Visual Studio 2008, почему нет функциональности, как это видно в меню рефакторинга при использовании C#?
Я использую переименовать постоянно, и вы действительно пропустите его, когда его там нет. Я уверен, что вы можете получить плагины, которые предлагают это, но почему он не интегрирован в IDE при использовании C++? Это из-за некоторых gotcha в том, что C++ должен быть проанализирован?
11 ответов:
синтаксис и семантика C++ делают его невероятно сложно для правильной реализации функции рефакторинга. Можно реализовать что-то относительно простое, чтобы охватить 90% случаев, но в оставшихся 10% случаев это простое решение ужасно сломает ваш код, изменив то, что вы никогда не хотели менять.
Читать http://yosefk.com/c++fqa / defective. html#defect-8 для краткого обсуждения трудностей, которые любые рефакторинг кода в C++ должен иметь дело.
Microsoft, очевидно, решил punt на этой конкретной функции для C++, оставив его до сторонних разработчиков, чтобы сделать то, что они могут.
Я не уверен, почему это так, но существуют сторонние инструменты, которые помогают. Например, прямо сейчас я оцениваю Визуальная Помощь X (весь помидор). Мы также используем Visual Studio 2005.
devexpress обеспечивает надстройку рефакторинг! для C++ для VS2005 и VS2008.
Не чувствуйте трудн-сделанный-мимо, оно не доступен внутри VB.Net либо:)
C++ - это сложный язык для анализа по сравнению с C# (VB тоже, если вы не включили "Option Explicit" и "Option Strict", трудно точно сказать, что делает любая строка кода из гораздо большего контекста).
по предположению, это может иметь какое-то отношение к "трудности" его предоставления.
П. С. Я отметил мой ответ как Вики сообщества, потому что я знаю, что оно не обеспечивает любая полезная информация.
существует много fud и путаницы вокруг этой проблемы. Это удивительное видео на youtube должно прояснить, почему рефакторинг C++ сложен:https://www.youtube.com/watch?v=mVbDzTM21BQ
tl;dr Google рефакторирует всю свою 100-миллионную кодовую базу C++ с помощью компилятора (Clang + LLVM), который позволяет получить доступ к его промежуточному формату.
итог, третьи стороны привинчены здесь, для них нет реалистичного способа рефакторинга против C++, если MS не выводит промежуточные результаты таким же образом. Если вы думаете об этом с точки зрения проблемы программирования, это очевидно: для рефакторинга VS C++ вы должны иметь возможность компилировать C++ точно так же, как и VS с теми же ошибками, ограничениями, недостатками, Хак, ярлыками, обходными путями и т. д. Обычные подозреваемые, такие как Coderush и Resharper, не имеют бюджета для такого рода безумия, хотя, по-видимому, они пытаются, но это было годы...
http://www.jetbrains.com/resharper-cpp/
обновление 2016: Resharper теперь делает достойную работу в C++ refactor. Ограничения действуют исключительно для крупных / гигантских проектов.
MS, наконец, сделал это: https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-33-C-Refactoring-in-Visual-Studio-2015#time=04m37s
Они начали делать это около 10 лет назад, я помню, как смотрел ms channel9 давно.
Я использую Визуальная Помощь X С visual studio около полутора лет. Это невероятный инструмент, который очень помогает вам с обычным кодом C++, но он не очень хорошо работает с шаблонным кодом. Например, если у вас есть сложный шаблон на основе политики, он не будет знать, как переименовать ваши переменные, и проект больше не будет компилироваться.
установить плагин, который позволяет вам эту функциональность: https://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194
Я хотел бы отметить, что Qt Creator (C++ IDE, которая совместима с библиотеками VC++ и системой сборки) обеспечивает переименование символов, которое работает очень хорошо:
вы можете переименовать символы во всех файлах проекта. При переименовании класса можно также изменить имена файлов, соответствующие имени класса.
Qt Creator-Рефакторинг: Переименование Символов
функция переименования Qt Creator дает вам список символов ссылки он нашел и возможность исключить любой из них перед выполнением замены. Поэтому, если он получает ссылку на символ неправильно, вы можете исключить его.
таким образом, переименование символов C++ возможно. Переходя к VS от Qt Creator, я чувствую вашу боль, до такой степени, что я рассмотрел возможность преобразования существующих проектов VS значительного размера для использования Qt Creator вместо этого.
Я не покупаю аргумент, что это особенно сложно в C++. В помимо того, что он уже очень хорошо работает в Qt Creator, есть тот факт, что компилятор и компоновщик могут находить и сопоставлять символы: если это было невозможно, вы не могли построить свое приложение.
на самом деле, такие языки, как Python, которые динамически типизированы, также имеют инструменты переименования. Если вы можете создать такой инструмент для языка, где нет явных ссылок на тип переменной, вы определенно можете сделать это для C++.
пример:
... Веревка, библиотека рефакторинга python... Я попробовал его для нескольких переименований, и это определенно сработало, как ожидалось.
переполнение стека-какие инструменты рефакторинга вы используете для Python?
ну, несмотря на комментарии всех вас экспертов, я полностью не согласен с тем, что проблема поддержки рефакторинга имеет какое-то отношение к семантике языка C++ или любой семантике языка, если на то пошло. За исключением того, что сам компилятор-строитель не решает реализовать его в первом случае из-за своих собственных причин или ограничений, какие бы они ни были.
и обида не должна быть принята, но я сожалею, что сказал г-н jsb приведенная выше ссылка, которую вы предоставили для поддержки Вашего дела (т. е. yosefk) о дефекте C++ об этом не может быть и речи. Это больше похоже на то, что вы предоставляете направление в "Лос-Анджелес", когда кто-то попросил "Сан-Франциско".
на мой взгляд, поднятие проблемы сложности рефакторинга для определенного языка больше похоже на поднятие пальца на саму целостность языка. Особенно для языков, которые иногда просто болят.... когда дело доходит до их объявления переменных и использования. :) Ладно! скажите мне, как вы теряете след какого-то узла в дереве узлов ... а? Так что же делать с любым язык будет таким же простым, как код машинного уровня. Вы знаете, что компилятор VS может легко определить, является ли какая-либо переменная или подпрограмма мертвым кодом. Понял мою точку зрения?
о разработке стороннего инструмента. Я думаю, что поставщики компиляторов могут реализовать его гораздо проще и эффективнее, если они когда-либо хотели, то сторонний инструмент, который должен будет дублировать всю базу данных синтаксического анализа для ее обработки. В настоящее время компилятор может оптимизировать код очень эффективно на уровне машинного кода, и я слышу здесь, что его трудно сказать, как какая-то переменная используется ранее. Вы не обратили никакого реального внимания на внутреннюю работу компилятора, я полагаю. В какую базу данных он укладывается.
и уверен, что это почти та же база данных, которую IDE использует для всех подобных целей. В предыдущее время компилятор был просто отдельной сущностью, а IDE - просто текстовым редактором с некоторой специализацией, но с течением времени разрыв между компилятором и редактором IDE стал меньше, и его непосредственно начали работать на подобном разборе база данных. Что позволяет более эффективно обрабатывать все эти intellisense и рефакторинг или другие проблемы, связанные с синтаксисом. С предварительной компиляции все вещи и JIT-компиляцию этот разрыв почти нерадивых. Поэтому почти имеет смысл использовать одну и ту же базу данных для обеих целей, иначе ваш спрос на память будет выше из-за дублирования.
вы все программисты - я нет! И вам, ребята, кажется, трудно визуализировать, как рефакторинг может быть реализован для C++ или любого языка, который Я не могу понять. Его просто все о чем-то вы должны приложить больше усилий для некоторых меньше в зависимости от того, насколько тяжелым является человек, которого вы пытаетесь подтолкнуть.
в любом случае способ против хорошей IDE, особенно когда речь заходит о C#.