Чому Visual C ++ не має функцій рефактора?


78

Чому при програмуванні на C ++ у Visual Studio 2008 чому немає такої функціональності, яку можна побачити в меню рефактора при використанні C #?

Я використовую Перейменування постійно, і ви дійсно сумуєте, коли його немає. Я впевнений, що ви можете отримати плагіни, які пропонують це, але чому він не інтегрований в IDE при використанні C ++? Чи це пов’язано з деякою помилкою у тому, що C ++ повинен бути проаналізований?


1
рефакторинг важкий для C ++, але я відчуваю, що VS повинен додати Rename allтакий функціонал, як той у Xcode C ++.
Ділан Ченскі

Відповіді:


70

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

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

Очевидно, Microsoft вирішила зайнятися цією особливістю для C ++, залишивши стороннім розробникам робити все, що можуть.


8
Ні, справді досить погане посилання. Хлопець розчарований і навіть не ввічливий (одного разу зв’язався з хлопцем щодо явно образливих моментів, він взагалі не піклувався). Але так, рефакторинг явно важкий (залежно від розміру коду), і потрібно двічі подумати над початковим дизайном.
Reder

16
Отже, тут ми констатуємо, що Microsoft погано вирішує неймовірно складні завдання, тоді як Eclipse Foundation краще? Я програмую в VS на обмеження проекту, але коли мені потрібно перейменувати змінну, я запускаю Eclipse саме для цього ...
Zac

10
Чому це прийнята відповідь? Розбір коду С ++ на семантично значущу форму МОЖЕ здійснити компілятор. MS очевидно володіє компілятором, який входить до їх IDE. Чому б не використовувати той самий код розбору? Насправді не має значення, наскільки важким є синтаксичний аналіз, оскільки вони це вже роблять.
Джо

4
Це погане посилання, оскільки автору бракує знань про C ++. Наприклад, він не знає про RVO. Інструменти рефакторингу досить прості, якщо ви готові використовувати API Clang, де автори вже пройшли через це пекло дозволу на перевантаження. Проблема в тому, що MSVS не має такого API.
polkovnikov.ph

2
Microsoft Visual Studio 2015 може рефакторингу перейменовувати деякі з кодів C ++.
аерозон

11

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


Visual Assist X досить хороший і, як правило, робить цю роботу досить добре. Однак, якщо ви використовуєте всі метапрограми шаблонів на ньому, він може підняти руки до деякого вашого коду.
Doug T.

2
Це правда. Я помітив, що він не дуже добре обробляє декілька шарів шаблонів (наприклад, під час роботи з Boost).
Брайан


4

Не турбуйтеся, це також недоступно у VB.Net :)

C ++ - це ТВОРДА мова для синтаксичного аналізу в порівнянні з C # (VB теж, якщо ви не ввімкнули "Option Explicit" і "Option Strict", важко точно сказати, що робить будь-який рядок коду з НАБАГАТО більшого контексту).

На думку, це може мати щось спільне з "труднощами" його надання.

PS Я позначив свою відповідь як wiki спільноти, бо знаю, що вона не надає ніякої корисної інформації.


4

Eclipse робить кілька рефакторингів на C ++, включаючи 'перейменувати'. Перевірте це питання тут, на StackOverflow.

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

Спробуйте Eclipse і перевірте, чи підходить він вам.


3

У цьому питанні багато неприємностей та плутанини. Це дивовижне відео на YouTube має з’ясувати, чому важко переробляти C ++: https://www.youtube.com/watch?v=mVbDzTM21BQ

tl; dr Google реконструює всю їх 100-мільйонну базу коду C ++ за допомогою компілятора (Clang + LLVM), що дозволяє отримати доступ до її проміжного формату.

Підсумок, сторонні сторони тут накручені, для них немає реалістичного способу рефакторингу VS C ++, якщо MS так само не виводить проміжні результати. Якщо ви думаєте про це з точки зору проблем програмування, це очевидно: для рефакторингу VS C ++ ви повинні вміти компілювати C ++ точно так само, як це робить VS з тими ж помилками, обмеженнями, недоліками, хаками, ярликами, обхідними шляхами тощо. Звичайні підозрювані, такі як Кодеруш і Решарпер, не мають бюджету на такий маразм, хоча, мабуть, вони намагаються це зробити, але пройшли роки ...

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

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



1

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



0

Я хотів би зазначити, що 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 ++.

Приклад:

... Мотузка, бібліотека рефакторингу python ... Я спробував це зробити за кілька перейменувань, і це, безумовно, спрацювало, як очікувалося.

Переповнення стеку - Які інструменти рефакторингу ви використовуєте для Python?


-3

Ну, незважаючи на коментарі всіх вас, експертів, я абсолютно не згоден з тим, що проблема підтримки рефакторингу має щось спільне з семантикою мови С ++ або будь-якою мовною семантикою. За винятком того, що самі розробники компіляторів не вирішують впровадити його в першу чергу через власні причини чи обмеження, якими б вони не були.

І образи не слід сприймати, але мені шкода сказати, містер jsb, вищевказане посилання, яке ви надали на підтримку вашої справи (тобто Йосефка) щодо дефекту С ++, абсолютно не може бути імовірним. Це більше схоже на те, що ви даєте вказівки "Лос-Анджелесу", коли хтось просить про "Сан-Франріско".

На мою думку, підняття проблеми з труднощами рефакторингу для певної мови більше схоже на підняття пальця на цілісність мови. Особливо для мов, що часом буває просто болем .... коли йдеться про їх декларування та використання змінних. :) Добре! скажи мені, як ти втрачаєш якийсь вузол у дереві вузлів ... так? Отже, що це робити з будь-якою мовою, нехай це буде так просто, як код машинного рівня. Ви знаєте, що компілятор VS може легко виявити, чи є якась змінна або процедура мертвим кодом. Зрозумів?

Про розробку сторонніх інструментів. Я думаю, що виробники компіляторів можуть реалізувати це набагато легше та ефективніше, якщо вони коли-небудь захотіли використовувати інструмент третьої сторони, який повинен дублювати всю базу даних синтаксичного аналізу для його обробки. Сьогодні компілятор може дуже ефективно оптимізувати код на рівні машинного коду, і я чую тут, що важко сказати, як якась змінна використовується раніше. Ви гадаєте, ви не звернули жодної реальної уваги на внутрішню роботу компілятора. Яку базу даних вона зберігає.

І впевнений, це майже та сама база даних, яку IDE використовує для всіх подібних цілей. Раніше компілятор був лише окремою суттю, а IDE - лише текстовим редактором з певною спеціалізацією, але з часом розрив між компілятором та редактором IDE стає меншим, і його безпосередньо починає працювати над подібною аналізованою базою даних. Що дозволяє ефективніше обробляти всі ці проблеми, пов’язані з інтелісенсом та рефакторінгом чи іншими синтаксисом. З усіма попередньо скомпільованими речами та JIT заповнення цього пробілу майже недбале. Тому майже має сенс використовувати одну і ту ж базу даних для обох цілей, інакше ваш попит на пам’ять зросте через дублювання.

Ви всі програмісти - я ні! А у вас, хлопці, здається, виникають труднощі з візуалізацією того, як можна реалізувати рефакторинг для C ++ або будь-якої мови, яку я не можу зрозуміти. Це просто для чогось, що ви повинні докласти більше зусиль, а деякі менше, залежно від того, наскільки важкою є людина, яку ви намагаєтесь штовхнути.

У будь-якому випадку, проти гарної IDE, особливо якщо мова йде про C #.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.