Рефакторинг C++ кода в Visual Studio 2015

Автор оригинала: Gabriel Ha
  • Перевод
  • Tutorial
Hello C++ World!

В прошлую пятницу вышел релиз Visual Studio 2015 Preview, в котором были представлены новые возможности увеличения продуктивности разработки, в том числе рефакторинг кода на С++. В значительной мере на реализацию этого функционала повлияли отзывы комьюнити, которые были получены в ходе тестирования Visual Studio «14» CTPs, так что спасибо всем поучаствовавшим.

В этой статье мы рассмотрим такие возможности Visual Studio 2015 Preview по работе над С++ кодом, как:
  • Переименование (Rename)
  • Извлечение функции (Extract Function)
  • Генерация заглушек чисто виртуальных методов (Implement Pure Virtuals)
  • Генерация объявлений/заглушек методов (Create Declaration/Definition)
  • Перемещение объявлений функций (Move Function Definition)
  • Преобразование в Raw-String (Convert to Raw-String Literal)


Переименование, безусловно, наиболее часто нужный инструмент. Таким образом мы поместили его в самом верху контекстного меню при правом клике на классе\функции\переменной. Кроме того, мы можете активировать его двойным нажатием комбинации Ctrl+R. Сам инструмент двухшаговый — в первом окне вы указываете настройки переименования, второе окно — превью.

image
image

Полезные подсказки
  • Вы можете отключить поиск переименовываемого символа в комментариях и строковых литералах в первом окне (галочка «Search comments/strings»)
  • Также вы можете включить просмотр найденных в комментариях и строках символов, но не переименовывать их (галочка «Rename comments/strings»)
  • Больше информации об этой фиче вы можете найти вот в этом видео


Извлечение функции было второй по количеству запросов фичей. Мы всё ещё в процессе работы над ней, так что пока что она реализована в виде расширения. После его установки выделите блок кода, который хотите выделить в отдельную функцию, затем правый клик и в меню «Refactor…» выберите «Extract Function/Method».

image

Полезные подсказки
  • Инструмент имеет кое-какие средства валидации кода, но всё же для нормальной работы старайтесь выделять валидный, целостный блок кода.
  • Извлекаемая функция сохраняет контекст. Это означает, что если вы извлекаете часть кода из метода какого-либо класса, то новая функция будет методом этого же класса.


Генерация заглушек виртуальных методов позволяет создать тела всех чисто виртуальных методов в наследуемом классе. Поддерживается множественное наследование. Инструмент вызывается из контекстного меню объявления класса.

image

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


Важный момент: все вышеперечисленные функции работают только при включенном IntelliSense.

Генерация объявлений/заглушек методов позволяет вам быстро сгенерировать недостающее объявление или заглушку тела метода.

image

image

Полезные подсказки
  • Методы, имеющие тело, но не определённые в заголовочном файле будут подчёркнуты волнистой зелёной линией
  • Можно сгенирировать определения\заглушки сразу для нескольких методов (нужно выделить все и выбрать в контекстном меню «Refactor->Create Declaration/Definition»)
  • Больше информации об этом инструменте вы можете найти в этом видео


Перемещение объявлений методов позволяет быстро переместить тело метода из заголовочного файла в cpp-файл или наоборот.

image

Полезные подсказки
  • Больше информации об этом инструменте вы можете найти в этом видео


Преобразование в Raw-String позволяет вам сконвертировать любую строку в Raw-String, что значительно улучшает читабельность строк с escape-последовательностями. Функция вызывается из контекстного меню в любом месте строки.

image

Полезные подсказки
  • В данный момент поддерживаются только следующие символы: \n, \t, \', \", \?
  • Если в вашей строке есть другие escape-последовательности вы получите сообщение об ошибке
  • Обратного преобразования нет — пользуйтесь undo
Инфопульс Украина
Creating Value, Delivering Excellence
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 15

  • НЛО прилетело и опубликовало эту надпись здесь
      +4
      Однако и CLion не догоняет набор Visual Studio + Visual AssistX.
      • НЛО прилетело и опубликовало эту надпись здесь
          +2
          CLion-ом я, конечно, пользовался минут 30, но вот с Visual AssistX работаю уже лет 5. Подкупает он несколькими вещами:
          -Удобная навигация по коду — переходы между объявлениями\реализацией, переход от символа к объявлению,
          -Поиск: символа в проекте, вызовов функции
          -Подстановка инклюдов
          -Подсветка синтаксиса
          -Реально работающее автодополнение, а не эти волшебные грабли IntelliSense
          -Сниппеты
          -Удобные окошки показывающие структуру проекта\файла кода
          -Рефакторинг (ну это и в CLion есть)

          Субъективно CLion неплох, но до рабочего инструмента, которым можно пользоваться интуитивно и в котором точно есть нужная тебе фича и она реально работает так, как задумана — до этого состояния ему ещё далеко.
          • НЛО прилетело и опубликовало эту надпись здесь
              +4
              В Mac OS установил CLion, он 40 минут пердел пытаясь открыть мой рабочий проект. Потом я нифига не нашел где cmake-у передать аргументы. Посмотрел на все это дико тормозящее чудо и удалил его. Мелкие проекты открывал нормально, но действительно ему еще далеко до идеала. Правда было это давненько, может что изменилось.
              За весь период работы перепробовал кучу IDE ( Eclipse, xcode, qt-creator и т.д. ), но ничего лучше Visual Studio + Visual AssistX еще не видел, и это довольно грустно.
              • НЛО прилетело и опубликовало эту надпись здесь
        +2
        Ну ключевым моментом для меня является это использование памяти, VS тут выигрывает у Java IDE очень сильно. А зная как жрут память продукты от JetBrains, как-то и не хочу их использовать, увы, не нравится мне их прожорливость.

        Юзаю с Visual Assist, потребляемая память болтается в основном в районе 200-300Мб. Тогда как Java среды спокойно разжираются до 1Гб, а временами и выше. Посмотрел на Resharper for C++ EAP, нда, если так же будет работать с памятью в релизе, то оно не надо. Менее чем за час разжирается до 2Гб и всё, среда реагирует по 5 секунд на нажатие кнопок. Тестировалось на 2013й.

        Остаюсь на VS + VA ибо VA даёт всё что надо в плане рефакторинга и индексации файлов.

        Ну и последнее, не верится, что в 2015 заведется всё хорошо, в первую очередь VA использую именно потому, что Intellisense не способен правильно проиндексировать файлы и большая куча кода подчёркнуто красным. Например в моём случае вообще никак не хочет индексировать инклудники boost. И какой-бы рефакторинг не был, код в красных полосочках редактировать не хочется.
        0
        Когда уже в Visual Studio при работе с проектом C++ будет возможность автоматически выстраивать код так же, как в C#? :(
        Удобно ведь, ставишь закрывающуюся скобку } и весь код выше выстраивается с учетом всех отступов.

        В 2010 не добавили, в 2012 тоже не наблюдаю (кроме комбинации клавиш которая и раньше была, но это не то), дальше студии больше не устанавливал.
          +1
          Visual Assist X это делает, а вот визуалка да, с форматированием туговато. Ну и у C++ набор грамматик куда как сложнее, соответственно и правила посложнее сделать, хотя не верю, что корпорация этого сделать не может, просто им надо подсадить на C#, видимо и делаю часть C# удобнее.
            +1
            Это есть в 2013.
              0
              Супер, спасибо что сказали
            +1
            Интересно, а что там с поддержкой C++11 и C++14, а то нескольких фич просто очень сильно не хватает. Будет ли constexpr, появился ли using для конструкторов и = default для методов?

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое