Есть ли работающий инструмент 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, используя кодовую базу в 20 МБ.

Тест 1: метод извлечения: приводит к исключению Resharper. Исходный код не изменился.

Тест 2: метод извлечения с другим источником: работает нормально

Тест 3: изменение сигнатуры извлеченной функции: результаты в неработающем коде C ++:

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

Может быть, поэтому C ++ его нет на главной странице.

По моему мнению, ответ на этот вопрос все еще "НЕТ" .

RED SOFT ADAIR
источник
11
Favorite'd этот. Проблема с C ++ заключается в его очень сложном, контекстно-зависимом синтаксисе. Без фактического разбора полного источника вы не можете быть уверены, что означает идентификатор.
DevSolar
См. Также: stackoverflow.com/questions/249827/…, но он не может многое предложить
dmckee --- котенок экс-модератора
4
Eclipse на самом деле работает довольно хорошо, вам просто нужно позволить ему использовать больше памяти, отредактировав eclipse.ini
n0rd
3
Если вы все еще наблюдаете за инструментами рефакторинга для C ++, учтите, что в JetBrains в настоящее время мы работаем над поддержкой C ++ в ReSharper и отдельной кроссплатформенной C ++ IDE
Юра Гороховский,
1
@ КРАСНЫЙ МЯГКИЙ ПРОЦЕСС, ты знаменит. Проверьте это youtu.be/RT46MpK39rQ?t=1611
Джордж С.

Ответы:

38

Я считаю Visual Assist X с Visual Studio очень полезным. Другой выбор - Refactor для C ++ .

Gant
источник
8
К сожалению, Refactor для C ++ плохо работает (если вообще) с большими кодами.
Даниэль Роуз
1
Что конкретно происходит с Refactor для C ++ и большими кодами?
Ира Бакстер
2
@IraBaxter Это просто сломано. Параметры рефакторинга либо не отображаются, либо не завершены. Есть странные сообщения об ошибках или нет вообще.
Даниэль Роуз
4
Refactor для C ++ не работает хорошо даже для небольших кодовых баз, он сломан и вообще непригоден для использования.
Kovarex
3
@ Nils: можете ли вы привести конкретный пример того, что он не понимает?
Ира Бакстер
41

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

Том Лейс
источник
23

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

Google уже сделал масштабный инструмент рефакторинга, используя clang .

HighCommander4
источник
2
Но есть ли какой-то результат, который может использовать простой смертный вне Google?
Ян Худек
1
@JanHudec: ознакомьтесь с учебником, на который можно
посмотреть
17

Mozilla имеет свой собственный инструмент рефакторинга под названием Pork ( Wiki , Developer Wiki ). Вот блог разработчика Pork. Из того, что я прочитал, свинина была успешно использована в рефакторинге в Mozilla.

Свинина должна помочь, если вы приехали из * nix land, для Visual Studio я тоже рекомендую Visual Assist.

Кристиан Адам
источник
9

Наш DMS Software Reengineering Toolkit - это механизм преобразования, разработанный для выполнения сложных преобразований больших массивов кода, включая C ++. Он был использован для внесения надежных изменений в системах миллионов строк кода. Он работает с использованием точных компиляторов анализаторов и преобразователей языка.

Он имеет полный синтаксический анализатор C ++ с разрешением имен и типов, создает AST-коды кода, может применять процедурные преобразования или преобразования источника-источника (с синтаксисом поверхности C ++) для пересмотра этих деревьев и регенерации компилируемого вывода с сохранением комментариев. (Правка: 01.07.2011: теперь работает C ++ 1X, насколько мы понимаем стандарт :)

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

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

То, чем оно не является (в настоящее время), является интерактивным инструментом рефакторинга. Мы считаем, что для успешного проведения большинства рефакторингов необходим глубокий контроль и анализ данных. DMS имеет общий механизм для поддержки этого, и этот механизм реализован для C, COBOL и Java на данном этапе, с C ++ следующим на очереди. Это тяжелая работа. Вы не увидите много серьезных инструментов рефакторинга C ++ ни от кого, пока эта проблема не будет хорошо решена. Для начала вам нужен полный синтаксический анализатор C ++: -}

РЕДАКТИРОВАТЬ 05.07.2011: Похоже, что мы собираемся пробовать на интерактивной версии. Мы выиграли этап I SBIR Министерства энергетики, чтобы выяснить, как это сделать. См. Http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (поиск семантических дизайнов в разделе «Техас»). Не ожидайте результата в спешке; это только начало 3-х фазной многолетней программы по освоению инструмента.

РЕДАКТИРОВАНИЕ 8/11/2011: Первый прогресс ... Теперь мы обрабатываем все директивы C ++ 0x и OpenMP.

РЕДАКТИРОВАТЬ 1/4/2012: выполняет полный контроль потока анализа кода C ++.

РЕДАКТИРОВАТЬ 15/09/2014: Теперь хорошо разбирайте синтаксический анализатор и механизм преобразования C ++ 14. Даже переименовывает довольно надежно на этом этапе: -}

Ира Бакстер
источник
Похоже, что на вашей странице загрузки нет ссылки для оценки этого инструмента semanticdesigns.com/Products/RegisterEval.html Доступна ли в настоящее время пробная версия и цены для VS2010 или VS2008?
SmacL
Для инструмента рефакторинга «не ожидайте результата в спешке». Наша фаза I НИОКР завершена, и мы подаем заявку на финансирование для Фазы II. Чтобы обсудить DMS и способы ее оценки, свяжитесь с компанией. Это не та вещь, которую вы «загружаете, чтобы оценить», точно так же, как Enterprise Oracle не является элементом загрузки.
Ира Бакстер
... DMS может преобразовывать VS2008 / VS2010, но не как интерактивный инструмент, и существуют ограничения в отношении директив препроцессора. (Хорошая новость заключается в том, что мы считаем, что решили с ними серьезную проблему и будем применять ее в программе исследований и разработок второго этапа).
Ира Бакстер
Спасибо за отзыв, но он не похож на тот инструмент, который мне нужен. Мне не нужно интерактивное, просто что-то, что может выполнять достаточно простые преобразования на большой кодовой базе без затрат на руку и ногу, например, изменение количества параметров, принимаемых вызовом, изменение параметра указателя на ссылку. VisualAssist близок, но просто нужно пойти немного дальше.
SmacL
3
... целью DMS является включение кодирования и безошибочного применения преобразований кода, будь то «рефакторинг» или «нет». Да, это сложно, и мы еще не там. Мы ближе IMNSHO, чем любой другой инструмент, который я видел для C ++, и в наших основах нет ничего плохого. Остались неприятные проблемы с препроцессором, масштабированием кода и попыткой корректно закодировать семантику C ++, чтобы разрешить такие преобразования. И я буду первым, кто скажет, что это БОЛЬШОЙ проект.
Ира Бакстер
8

Если вы используете emacs, попробуйте Xrefactory . Он поддерживает извлечение методов, переименование классов / функций / переменных и вставку / удаление / перемещение параметров. Он также имеет очень хороший / быстрый механизм завершения кода.

bmeric
источник
6

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

Кстати, SlickEdit отказался от своих функций рефакторинга?

quamrana
источник
Язык сделал изменение значительно, с выходом стандарта C ++ 2011. Дополнительные сложности усложняют проблему, а не облегчают ее, потому что всем пользователям потребуются все расширенные языковые функции и возможность рефакторинга: - {
Ира Бакстер
2
Недавно прочитав о возможностях Slickedit, выяснилось, что он определяет определение, соответствующее использованию имени эвристическими методами. Это не делает "правильный" поиск имени C ++. Это означает, что вы не можете доверять его преобразованиям, чтобы быть правильными. Если вы не против проверить его работу, это может быть хорошо для вас. На действительно больших пакетах программного обеспечения это, вероятно, не хорошо. Мое мнение.
Ира Бакстер
4

Я рекомендую попробовать rtags, если вы используете emacs и еще не пробовали его (есть также пакет для vim). Это клиент-серверное приложение на основе clang, которое индексирует код C / C ++, включая следующие функции:

  • перейти к определению / объявлению
  • найти все ссылки, перейти к следующему / предыдущему
  • переименовать символ
  • интеграция с «исправлениями» clang

Я решил попробовать после просмотра этого доклада, который представил мне rtags (и emacs).

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

Помимо того, что поддерживается rtags, мне также нужны некоторые дополнительные полезные функции, в том числе:

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

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

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

Николай Бобовников
источник
3

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

Ира Бакстер
источник
1
DMS был использован для автоматизации реархитектуры больших массивов кода C ++. См. Акерс Р., Бакстер И., Мелих М., Эллис Б., Люк К., Практический пример: реинжиниринг моделей компонентов C ++ с помощью автоматического преобразования программ, информационно-программная технология 49 (3): 275 -291 2007. Доступен от издателя
Ира Бакстер
Не знаю, что вы подразумеваете под «элегантным выходом». Вывод, который вы получаете от DMS, явно зависит от того, что вы даете, и какие преобразования вы применяете. Если преобразование не касается части кода, эта часть кода будет такой же элегантной или нет, как это было в первую очередь. Если он действительно касается кода, элегантность определяется тем, насколько умны преобразования, так же как и ручные изменения кодера. Я не думаю, что это элегантность, но форматирование результата может быть либо печатью «верности» (исходный формат), либо определенным стилем красивой печати.
Ира Бакстер
2

Обязательно стоит упомянуть Klocwork как коммерческий пакет рефакторинга кода. Это выглядит очень многообещающе, когда вы просматриваете демонстрационное видео.

muenalan
источник
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-дневный пробный период, и мы обнаружили, что он быстрее и более полнофункциональный, чем встроенный IntelliSense в самом продукте Visual C ++.

JBRWilkinson
источник
2
Я не думал, что вы можете использовать плагины с экспресс-выпуском
Yacoby
3
Я конечно пытался установить VA с VS C ++ express в прошлом, и это не сработало.
Quamrana
Вы не можете устанавливать плагины Visual Studio в изолированном режиме (все выпуски Express запускают IDE в изолированном режиме). Если вы студент, вы можете загрузить полные версии Visual Studio из DreamSpark или MSDNAA.
Билли ONEAL
1

Если вы ищете для реинжиниринга вашей кодовой базы: MOOSE. Но это большая коллекция инструментов анализа и реинжиниринга, а не редактор.

Стефан Эггермонт
источник
1

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

Роберт Хегнер
источник
Да, я видел это, но это только первая попытка и охватывает только «переименовать». Нет функции извлечения и т. Д. Но я с нетерпением жду еще больше ...
RED SOFT ADAIR
1

Определенно Resharper Ultimate это путь. Счастье гарантировано :)

В бета-версии по состоянию на март 2015 года.

hdoghmen
источник
Я наконец попробовал и обновил свой Вопрос. Спасибо, в любом случае.
RED SOFT ADAIR
Это для .NET .... не C ++.
wcochran
1

CLion выглядит очень перспективно.

Отказ от ответственности: я еще не пробовал, так как мне нужно преобразовать свои проекты в формат 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

PeterSom
источник
Очень интересно. Я скачал его, и он не запустится. Пожалуйста, смотрите github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR
0

Я нашел следующий плагин для Visual Studio 2013: Visual C ++ Refactoring by Microsoft.

Это простой инструмент переименования, но он работает безупречно. После щелчка правой кнопкой мыши на символе добавляется следующее контекстное меню:

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

Zac
источник