Какой рефакторинг C++ вы используете на практике?

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

Мой вопрос: какой рефакторинг вы действительно используете в своей повседневной работе? Существуют очевидные вещи, такие как переименование переменной / класса / метода, но есть ли что-то конкретное для C++, например, работа с шаблонами, STL, конструкторами копирования, инициализаторами и т. Д. И т. Д.?

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

Заранее спасибо.

6 ответов

Решение

Как вы сказали, есть очевидные вещи:

  • переименование одно
  • изменение сигнатуры функции является другим (особенно потому, что функция почти обязательно дублируется: объявление в заголовке и реализация в источнике)
  • переименование / перемещение файла (обновление директив include)

Обратите внимание, что, хотя это базовое, с ним редко справляются. Моя основная жалоба заключается в том, что комментарии, как правило, не обновляются (я не говорю о бесполезном автоматическом генерировании doxygen). Так что, если я описывал использование класса в заголовке или обоснование использования этого класса в другом исходном файле, комментарий теперь устарел, потому что после переименования класса никто не узнает, на что он ссылается...

Однако есть гораздо более интересные случаи:

  • При изменении подписи функции необходимо обновить все сайты вызовов, разработчику потребуется помощь для их локализации.
  • С наследованием - возможность действовать на все классы иерархии: изменение сигнатуры функции (еще раз) или добавление / удаление виртуального переопределения.
  • С шаблоном: предложение концепции было удалено, было бы хорошо, если бы вы могли синтезировать требования к переданному типу (необходимые методы / внутренние типы), чтобы при изменении этих требований (путем изменения определения шаблона) каждый получал уведомление о списке классов, которые используются этим шаблоном и более не соответствуют ему (и должны быть обновлены). Обратите внимание, что в случае, если это просто переименование типа / метода, вы можете автоматически распространять изменение, если оно больше ничего не нарушает.

Удачи...

Из ответов довольно ясно, что немногие программисты на C++ когда-либо видели реальный инструмент рефакторинга. Да, они довольно редки и специфичны для IDE, которую вы используете. Это неизбежно, иначе нет хорошего способа узнать, какие файлы исходного кода вносят код в конечный исполняемый файл. Препроцессор делает его более сложным, вам нужно знать значения макросов. Анализатор исходного кода требуется, но не достаточно.

Visual Assist для VS - это тот, кого я знаю.

Один рефакторинг, который я хотел бы поддержать - это метод inject. Более или менее противоположность метода извлечения.

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

Вот шаблон проектирования C++, который я придумал вчера: наследование Ditch в пользу политик.

Взгляните на статью " Рефакторинг Мартина Фаулера : улучшение дизайна существующего кода и рефакторинг к шаблонам " Джошуа Кериевского. Они, в свою очередь, ссылаются на книгу GoF Design Patterns, так что получите это тоже.

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

Привет, я использую http://www.devexpress.com/Products/Visual_Studio_Add-in/RefactorCPP/ с этим инструментом, я делаю переименование переменной / класса / метода, изменение тела функции, инициализаторы

Другие вопросы по тегам