Чи є робочий інструмент рефакторингу C ++? [зачинено]


161

Хтось знає повнофункціональний інструмент рефакторингу для C ++, який надійно працює з великими базами коду (приблизно 100 000 рядків)?

Я спробував все, що можу знайти знову і знову за останні роки: SlickEdit, Eclipse CDT. Усі вони були зовсім непридатними.

ПІДСУМОК : Я потребував часу та оцінював "Visual Assist X", а також "Refactor for C ++". Обидва мають вражаючі риси, але і те, і інше далеко не ідеально. Витяг великого блоку коду зазвичай не виконується без задоволення без ручних модифікацій - і тому не окупається.

"Visual Assist X" має приємні функції, такі як набагато більш повна автокомплектування тощо. Але це призводить до настільки мерехтливих і значно сповільнюється в певних точках.

На мій погляд, тому відповідь така: "Ні, для виробництва C ++ не існує готового для виробництва рефакторингу"

ОНОВЛЕННЯ Березень 2015 Що стосується відповіді hdoghmens сьогодні, я спробував Resharper для C ++. Його посилання https://www.jetbrains.com/resharper/ нічого не говорить про C ++. Але я знайшов Resharper C ++, про який було оголошено більше року тому тут:

https://www.jetbrains.com/resharper/features/cpp.html

Я спробував це з VC2010, використовуючи кодову базу 20MB.

Тест 1: Метод вилучення: призводить до виключення Resharper. Не змінено вихідний код.

Тест 2: Метод вилучення з іншим джерелом: прекрасно працює

Тест 3: Зміна підпису вилученої функції: Результати розбитого коду C ++

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

Можливо, тому C ++ його не вказано на головній сторінці.

На мою думку, відповідь на це питання все ще "НІ" .


11
Улюблений цей. Проблема C ++ - це його дуже складний, контекстно-залежний синтаксис. Без фактичного розбору повного джерела, ви не можете бути впевнені, що означає ідентифікатор.
DevSolar

Дивіться також: stackoverflow.com/questions/249827/…, але пропонувати це не багато
dmckee --- кошеня колишнього модератора

4
Eclipse насправді працює досить добре, просто потрібно дозволити йому використовувати більше пам’яті, редагуючи eclipse.ini
n0rd

3
Якщо ви все ще відстежуєте інструменти рефакторингу для C ++, врахуйте, що ми в JetBrains зараз працюємо над підтримкою C ++ у ReSharper та окремій кросплатформенній C ++ IDE
Юра Гороховський

1
@ RED ​​SOFT ADAIR Ви знамениті. Перевірте це на youtu.be/RT46MpK39rQ?t=1611
Джордж C.

Відповіді:


38

Я вважаю Visual Assist X з Visual Studio дуже корисним. Інший вибір - Refactor для C ++ .


8
На жаль, Refactor для C ++ не працює добре (якщо він взагалі є) з великими кодовими базами.
Даніель Роуз

1
Що конкретно відбувається з Refactor для C ++ і великих кодів?
Іра Бакстер

2
@IraBaxter Це просто зламано. Параметри рефакторингу або не відображаються, або не завершуються. Є дивні повідомлення про помилки або їх взагалі немає.
Даніель Роуз

4
Refactor для C ++ не працює навіть для невеликих баз кодів, він зламаний і зовсім непридатний для використання.
kovarex

3
@Nils: чи можете ви надати конкретний приклад того, чого він не розуміє?
Іра Бакстер

41

Visual Assist та Visual Studio значно спрощують справу з великими кодовими базами. Візуальна допомога добре відстежувати, як використовується клас або член, і більш ефективна при його перейменуванні без помилкових позитивних результатів, ніж пошук і заміна.


23

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

Google вже зробив масштабний інструмент рефакторингу, використовуючи кланг .


2
Але чи є якийсь результат цього, який просто смертний за межами Google міг би використати?
Ян Худек

1
@JanHudec: Ознайомтеся з посібником, пов’язаним звідси: comments.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4

17

У Mozilla є власний інструмент рефакторингу під назвою Pork ( Wiki , Developer Wiki ). Ось блог розробника за Pork. З того, що я читав, свинина з успіхом використовувалася в реконструкціях Mozilla.

Свинина повинна допомогти, якщо ви родом з * nix land, для Visual Studio я теж рекомендую Visual Assist.


9

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

Він має повний аналізатор C ++ з роздільною здатністю імені та типу, будує код AST, може застосовувати процедурні перетворення або джерело-джерело (із синтаксисом поверхні C ++) для перегляду цих дерев та відновлення складеного результату із збереженими коментарями. (Редагувати: 7.07.2011: Тепер C ++ 1X наскільки ми розуміємо стандарт :)

Він використовувався у масштабних проектах реінжинірингу, включаючи реконструкцію компонентів C ++ та 100% повністю автоматизованих перекладів між мовами. Про це можна прочитати на веб-сайті.

DMS також використовується для побудови довільних інструментів аналізу джерел. Приклади включають виявлення клонів, тестове покриття, розумну різницю (порівняння структур вихідного коду та абстрактних операцій редагування, а не рядки з простою вставкою та видаленням) тощо.

Що це не (зараз) - це інтерактивний інструмент рефакторингу. Ми вважаємо, що для того, щоб зробити більшість рефакторних робіт добре, вам потрібен глибокий контроль та аналіз даних. DMS має універсальну техніку для підтримки цього, і ця техніка реалізована для C, COBOL та Java на даний момент, причому C ++ є наступним на черзі. Це важка робота. Ви не побачите багато серйозних інструментів рефакторингу C ++ від кого-небудь, поки ця проблема не буде добре вирішена. Спочатку вам потрібен повний аналізатор C ++: -}

EDIT 7/5/2011: Схоже, ми збираємося пройти інтерактивну версію. Ми виграли відділ енергетичної фази I SBIR, щоб дослідити, як це зробити. Дивіться сторінку http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (Шукайте семантичні дизайни у ​​розділі "Техас"). Не чекайте результату поспіхом; це лише початок трифазної багаторічної програми, щоб дістатись до інструменту.

EDIT 8/11/2011: Перший прогрес ... зараз ми обробляємо всі C ++ 0x та OpenMP директиви.

EDIT 1/4/2012: Чи здійснює повний контроль потоку контролю коду C ++.

РЕДАКЦІЯ 15.09.2014: Тепер у руці добре мати двигун розбору / перетворення C ++ 14 переднього кінця. Навіть перейменування досить надійно в цей момент: -}


На вашій сторінці завантаження semanticdesigns.com/Products/RegisterEval.html не існує посилання для оцінки цього інструмента. Чи доступна пробна версія та ціни на даний момент для VS2010 або VS2008?
SmacL

Що стосується інструменту рефакторингу, "не очікуйте результату поспішати". Наше завдання з науково-дослідної роботи Фази I закінчено, і ми подаємо заявки на кошти на ІІ етап. Щоб обговорити DMS та засоби його оцінки, зверніться до компанії. Це не те, що ви "завантажуєте для оцінки" так само, як Enterprise Oracle не є елементом завантаження.
Іра Бакстер

... DMS здатний трансформувати VS2008 / VS2010, але не як інтерактивний інструмент, і існують обмеження щодо директив препроцесора. (Хороша новина полягає в тому, що ми думаємо, що ми вирішили головну проблему з цим, і будемо застосовувати це в програмі II і ІІ фази).
Іра Бакстер

Дякую за відгук, але він не схожий на тип інструменту, за яким я шукаю. У мене немає потреби в інтерактивних, лише те, що може виконувати досить прості перетворення на великій базі коду, не витрачаючи руку і ногу, наприклад, зміна кількості параметрів, які приймає виклик, змінюючи параметр вказівника на посилання. VisualAssist близький, але просто потрібно піти трохи далі.
SmacL

3
... мета DMS - включити кодування та без помилок застосування перетворень коду, "рефакторинг" чи "ні". Так, важко, і нас там ще немає. Ми ближчі за IMNSHO, ніж будь-який інший інструмент, який я бачив для C ++, і з нашими основами інструментів немає нічого поганого. Залишилися неприємні проблеми з препроцесором, масштабом коду та зусиллями кодувати семантику C ++, щоб дозволити такі перетворення. І я першим скажу, що це ВЕЛИКИЙ проект.
Іра Бакстер

8

Якщо ви використовуєте emacs, спробуйте Xrefactory . Він підтримує вилучення методів, перейменування класів / функцій / змінних та встановлення / видалення / переміщення параметрів. Також він має дуже хороший / швидкий механізм заповнення коду.


6

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

btw, чи SlickEdit відмовився від рефакторингу?


Мова зробив зміна значно, з виходом стандарту C ++ 2011 року. Додаткові ускладнення ускладнюють проблему, а не простіше, тому що всі користувачі захочуть усі вдосконалені функції мови та здатність до рефакторингу: - {
Іра Бакстер

2
Нещодавно прочитавши можливості Slickedit, виявляється, що він визначає визначення, що відповідає використанню імені евристичними методами. Це не робить "правильного" пошуку C ++ імен. Це означає, що ви не можете довіряти правильності його перетворень. Якщо ви не проти перевірити його роботу, це може бути для вас нормально. На дійсно великих програмних пакетах це, мабуть, не добре. Моя думка.
Іра Бакстер

4

Я рекомендую спробувати rtags, якщо ви використовуєте emacs та ще не пробували його (також є пакет для vim). Це клієнт / серверна програма, що базується на кланге, що індексує код C / C ++ з такими можливостями:

  • перейти до визначення / декларації
  • знайти всі посилання, перейти до наступної / попередньої
  • перейменувати символ
  • інтеграція з "виправленнями" Кланга

Я вирішив спробувати після перегляду цієї розмови, яка представила для мене rtags (та emacs).

(Я мушу сказати, що я пішов так далеко лише після того, як мій QtCreator не зміг перейменувати деякі символи належним чином, що є зупинкою шоу для мого використання цього чудового IDE на даний момент)

Крім того, що підтримується rtags, мені також потрібні додаткові акуратні функції, зокрема:

  • створити визначення / прототип функції
  • функція вилучення
  • створити методи геттера / сеттера

Для цього я рекомендую використовувати пакет семантичного рефактора для emacs (не впевнений, чи є альтернативи для vim)

Як правило, інструменти на основі кланг виглядають дуже перспективно. Якщо вас цікавить додаткова інформація про інструменти кланг для рефакторингу C ++, в тому числі для проектів з великою базою кодів, кілька чудових переговорів від Чандлера Каррута.


3

DMS програмного забезпечення rengineering інструментарій робить це , я думаю. Це двигун перетворення коду, розроблений для великих масштабів і обробляє C ++. Поняття не маю, наскільки елегантним є вихід.


1
DMS використовувався для автоматизації перестановки великих тел коду C ++. Див. Akers, R., Baxter, I., Mehlich, M., Ellis, B., Luecke, K., Тематичне дослідження: Перепроектування компонентних моделей C ++ за допомогою автоматичної програмної трансформації, інформаційних та програмних технологій 49 (3): 275 -291 2007. Доступно від видавця
Ira Baxter

Не знаю, що ви маєте на увазі під "елегантним виходом". Вихід, який ви отримуєте від DMS, явно залежить від того, що ви надаєте, і які перетворення ви застосовуєте. Якщо трансформація не торкається частини коду, ця частина коду така ж елегантна чи не така, як це було в першу чергу. Якщо це стосується коду, витонченість визначається тим, наскільки розумні перетворення, як і зміни в посібнику кодера. Я не думаю, що це елегантність, але форматування результату може бути або «вірністю» друку (оригінальний формат), або певним стилем друку.
Іра Бакстер

2

Напевно, слід згадати Klocwork як набір комерційних рефакторингу. Це виглядає дуже перспективно, коли ви переглядаєте демонстраційне відео.


2

Проблема - шаблони C ++. Станом на 2019 рік мені не відомий жоден інструмент рефакторингу, який підтримує шаблони C ++. Я спробував VS2019, VisualAssist, Clion, QtCreator.

Розглянемо приклад:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

Якщо я запускаю Перейменувати рефакторинг foo::print , bar::printвін також повинен бути перейменований автоматично. Оскільки вони пов’язані через call_printекземпляри шаблонів функцій.


1

Якщо ви використовуєте Visual C ++ (Express Edition безкоштовний), ви можете скористатися Visual Assist від www.wholetomato.com (посилання на функції рефакторингу C ++).

Він має 30-денний пробний період, і ми виявили, що він є більш швидким і функціональним, ніж вбудований інтелігенція в самому продукті Visual C ++.


2
Я не думав, що ви можете використовувати плагіни з експрес-виданням
Yacoby

3
Я, звичайно, намагався встановити VA з VS C ++ express у минулому, і це не вийшло.
quamrana

Не можна встановити плагіни Visual Studio в ізольованому режимі (всі випуски Express запускають IDE в ізольованому режимі). Якщо ви студент, ви можете завантажити повні версії Visual Studio, хоча з DreamSpark або MSDNAA.
Біллі ONeal

1

Якщо ви хочете переглянути інженерну базу коду: MOOSE. Але це велика колекція інструментів для аналізу та реінжинірингу, а не редактор.


1

Зараз у Microsoft є розширення C ++ для рефакторингу для Visual Studio 2013: http://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194


Так, я це бачив, але це лише перша спроба і охоплює лише "перейменувати". Ніяких функцій видобутку і т. Д. Але я з нетерпінням чекаю на наступне…
ЧЕРВОНА МОЖА ПОМОЩА


1

Кліон виглядає дуже перспективно.

Відмова: Я ще не пробував цього, оскільки мені потрібно конвертувати свої проекти у формат CMake для того, щоб використовувати його.


1

Рекомендую спробувати Lattix . Це дозволяє проаналізувати великі бази C / C ++ для виявлення архітектури, виявлення проблемних залежностей та реінжинірингу коду для поліпшення модульності та зменшення технічної заборгованості. Lattix також пропонує ряд алгоритмів, які допомагають у процесі рефакторингу. Ці алгоритми допомагають вам зрозуміти, як переміщувати елементи з однієї частини ієрархії в іншу, розбивати цикли та переміщувати підсистеми, щоб поліпшити зв'язок і згуртованість підсистем. Ось результати Lattix, які аналізують ядро Android (1,6 мільйона LOC C / C ++). Повне розкриття: Я працюю в Lattix


1

Вибачте, що знайшли це питання лише пізно. Мої студенти та асистенти працюють над рефакторингом на C ++ приблизно з 2006 року. Більшість інфраструктури рефакторингу CDT була побудована моєю командою в Інституті програмного забезпечення IFS. оскільки вже пару років ми надаємо Cevelop нашій версії CDT підтримку модернізації коду C ++ тощо. Cevelop може працювати з великими базами коду, якщо робоча область налаштована правильно. Безкоштовно доступно на веб- сайті https://cevelop.com


Дуже цікаво. Я завантажив його, і він не почався. Будь ласка, дивіться github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR

0

Я знайшов наступний плагін для Visual Studio 2013: Visual C ++ Refactoring від Microsoft.

Це просто простий інструмент перейменування, але він працює бездоганно. Після додавання правого клацання на символ він додає таке контекстне меню:

введіть тут опис зображення

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