visual studio code рефакторинг кода
Refactoring
Source code refactoring can improve the quality and maintainability of your project by restructuring your code while not modifying the runtime behavior. Visual Studio Code supports refactoring operations (refactorings) such as Extract Method and Extract Variable to improve your code base from within your editor.
For example, a common refactoring used to avoid duplicating code (a maintenance headache) is the Extract Method refactoring, where you select source code that you’d like to reuse elsewhere and pull it out into its own shared method.
Refactorings are provided by a language service and VS Code has built-in support for TypeScript and JavaScript refactoring through the TypeScript language service. Refactoring support for other programming languages is provided through VS Code extensions which contribute language services. The UI and commands for refactoring are the same across languages, and in this topic we’ll demonstrate refactoring support with the TypeScript language service.
Code Actions = Quick Fixes and refactorings
In VS Code, Code Actions can provide both refactorings and Quick Fixes for detected issues (highlighted with green squiggles). An available Code Action is announced by a lightbulb near the source code when the cursor is on a squiggle or selected text region. Clicking on the Code Action lightbulb or using the Quick Fix command ⌘. (Windows, Linux Ctrl+. ) will display Quick Fixes and refactorings.
If you’d just like to see refactorings without Quick Fixes, you can use the Refactor command ( ⌃⇧R (Windows, Linux Ctrl+Shift+R ) ).
Note: If you prefer to not see the Code Action lightbulb in your editor, you can disable lightbulbs with the editor.lightbulb.enable setting. You can still open Quick Fixes through Quick Fix command and ⌘. (Windows, Linux Ctrl+. ) keyboard shortcut.
Refactoring actions
Extract Method
Select the source code you’d like to extract and then click on the lightbulb in the gutter or press ( ⌘. (Windows, Linux Ctrl+. ) ) to see available refactorings. Source code fragments can be extracted into a new method, or into a new function at various different scopes. During the extract refactoring, you will be prompted to provide a meaningful name.
Extract Variable
TypeScript language service provides Extract to const refactoring to create a new local variable for the currently selected expression:
When working with classes, you can also extract a value to a new property.
Rename symbol
Keybindings for Code Actions
The editor.action.codeAction command lets you configure keybindings for specific Code Actions. This keybinding, for example, triggers the Extract function refactoring Code Actions:
Code Action kinds are specified by extensions using the enhanced CodeActionProvided API. Kinds are hierarchical, so «kind»: «refactor» will show all refactoring Code Actions, whereas «kind»: «refactor.extract.function» will only show Extract function refactorings.
Using the above keybinding, if only a single «refactor.extract.function» Code Action is available, it will be automatically applied. If multiple Extract function Code Actions are available, we bring up a context menu to select them:
You can also control how/when Code Actions are automatically applied using the apply argument:
Valid values for «apply» :
This keybinding uses «preferred»: true to create a refactoring that always tries to extract the selected source code to a constant in the local scope:
Extensions with refactorings
You can find extensions that support refactoring by looking in the VS Code Marketplace. You can go to the Extensions view ( ⇧⌘X (Windows, Linux Ctrl+Shift+X ) ) and type ‘refactor’ in the search box. You can then sort by install count or ratings to see which extensions are popular.
Tip: The extensions shown above are dynamically queried. Click on an extension tile above to read the description and reviews to decide which extension is best for you.
Next steps
Common questions
Why don’t I see any lightbulbs when there are errors in my code?
Lightbulbs (Code Actions) are only shown when your cursor hovers over the text showing the error. Hovering over the text will show the error description, but you need to move the cursor or select text to see lightbulbs for Quick Fixes and refactorings.
«Абракадабра, рефактор!»: 5 расширений VS Code, которые упрощают рефакторинг
Разработчик Алекс Омейер поделился в блоге пятью расширениями VS Code для качественного, быстрого и упрощенного рефакторинга кода. Вот они.
1. JavaScript Booster
Включает в себя несколько действий, таких как:
2. Stepsize
Позволяет делать закладки и сообщать о техническом долге и коде для рефакторинга.
3. Abracadabra, refactor this!
Позволяет произвести рефакторинг кода быстро и безопасно. VS Code поставляется с несколькими базовыми инструментами для рефакторинга кода. Abracadabra расширяет возможности редактора:
4. Glean
Содержит инструменты рефакторинга для кодовой базы React. Позволяет:
5. SonarLint
Позволяет исправлять проблемы с кодированием до того, как они возникнут. Как средство проверки орфографии, расширение выделяет ошибки при написании кода, предоставляя четкие инструкции по исправлению. Поддерживает анализ кода JavaScript, TypeScript, Python, Java, HTML и PHP.
Редактирование и рефакторинг кода C++ в Visual Studio
Visual Studio предоставляет разные средства для написания, редактирования и рефакторинга кода.
IntelliSense
IntelliSense — это мощное средство завершения кода, которое предлагает символы и фрагменты по мере ввода кода. IntelliSense C++ в Visual Studio выполняется в реальном времени, анализируя вашу базу кода по мере ее обновления и предоставляя рекомендации. Чем больше символов вы вводите, тем меньше предлагается рекомендуемых результатов.
Некоторые символы пропускаются автоматически, чтобы еще больше сократить список результатов. Например, обращаясь извне класса к элементам его объекта, вы не сможете просмотреть частные элементы (по умолчанию) или защищенные элементы (если вы не в контексте дочернего класса). Вы можете настроить фильтрацию с помощью кнопок в нижней части.
Параметр Режим фильтрации списка членов определяет, какие виды автозавершения IntelliSense вы видите. По умолчанию для этого параметра установлено значение Нечеткий. Если при нечетком поиске соответствий у вас есть символ, который называется MyAwesomeClass, вы можете ввести MAC и найти класс в предложениях автозаполнения. Алгоритм нечеткого поиска задает минимальный порог, которому должны соответствовать символы, отображаемые в списке. При интеллектуальной фильтрации будут отображаться все символы, которые содержат подстроки, соответствующие тому, что вы ввели. При фильтрации по префиксу выполняется поиск строк, которые начинаются с введенных вами символов.
IntelliCode
IntelliCode — это средство IntelliSense на основе ИИ, которое помещает предположительно наиболее подходящий результат в верхнюю часть списка завершения. Для создания рекомендаций IntelliCode анализирует тысячи проектов с открытым кодом на GitHub, каждый из которых имеет более 100 звезд. В сочетании с контекстом кода список завершения используется для популяризации распространенных приемов работы.
В Visual Studio 2017 IntelliCode предоставляется как расширение в Visual Studio Marketplace.
Прогнозная технология IntelliSense (экспериментальная функция)
Прогнозная технология IntelliSense — это экспериментальная функция, которая ограничивает число результатов, отображаемых в раскрывающемся списке IntelliSense, на основе контекста. Алгоритм применяет сопоставление типов, чтобы отобразить только те результаты, которые соответствует ожидаемому типу. Самый просто пример: если ввести int x = и вызвать раскрывающийся список IntelliSense, вы увидите только целые числа или функции, которые их возвращают. Эта функция отключена по умолчанию, так как она еще разрабатывается. Лучше всего она работает с глобальными символами; функции-члены еще не поддерживаются. Можно включить эту функцию, введя «прогнозный» в поле быстрого запуска или последовательно выбрав Средства > Параметры > Текстовый редактор > C/C++ > Экспериментальные функции > Включить прогнозный IntelliSense.
Чтобы переопределить прогнозный IntelliSense и отобразить длинный список, нажмите клавиши CTRL+J. Если прогнозный IntelliSense включен, вызов CTRL+J удалит прогнозный фильтр. Повторное нажатие CTRL+J снова удалит фильтр специальных возможностей из результатов списка членов, где это применимо. Использование кнопки ([+]) в раскрывающемся списке IntelliSense аналогично нажатию клавиш CTRL+J. Наведите указатель на кнопку, чтобы увидеть подсказку о том, что сейчас отображается.
На предыдущем снимке экрана показаны несколько кнопок в раскрывающемся списке. Они позволяют включить фильтры IntelliSense для получения разных типов результатов:
Кнопка отображается, только если это применимо в текущем сеансе IntelliSense. Как правило, все кнопки одновременно не отображаются.
Шаблон IntelliSense
Когда курсор находится в определении шаблона, отображается строка шаблона. Она позволяет предоставлять аргументы примера шаблона для IntelliSense.
Изменения, вносимые в окне, применяются непосредственно к исходному коду, поэтому результаты отображаются в реальном времени.
Строка шаблона может автоматически предлагать вероятные варианты на основе экземпляров в коде. Щелкните Добавить все существующие экземпляры, чтобы просмотреть список всех аргументов, которые использовались для создания экземпляра шаблона, во всей базе кода.
В окне в нижней части редактора отображаются расположение и аргументы каждого экземпляра.
Подчеркивание ошибок и быстрые исправления
Если редактор определяет ошибку в коде, он подчеркнет ее цветной волнистой линией. Красные волнистые линии указывают на код, который не будет скомпилирован. Зеленые волнистые линии указывают на другие проблемы, которые также могут быть серьезными. Вы можете открыть окно Список ошибок, чтобы просмотреть дополнительные сведения о проблемах.
Для некоторых типов ошибок (а также общих шаблонов создания кода) редактор будет предлагать быстрое исправление в виде лампочки, которая отображается, если навести указатель мыши на волнистую линию. Щелкните стрелку вниз, чтобы просмотреть предложения.
Change tracking
При каждом изменении файла слева отображается желтая полоска, указывающая на то, что внесены несохраненные изменения. При сохранении файла полоска становится зеленой. Зеленая и желтая полоски отображаются, пока документ открыт в редакторе. Они представляют изменения, внесенные с момента последнего открытия документа.
Перенос кода
Строки кода можно перемещать вверх и вниз. Для этого выберите их, удерживая нажатой клавишу ALT и одну из клавиш со стрелками (вверх или вниз).
Вставка фрагментов кода
Фрагмент — это предварительно определенная часть исходного кода. Щелкните правой кнопкой мыши одну точку или выбранный текст для вставки фрагмента или размещения выбранного текста внутри фрагмента. На следующем рисунке показана процедура размещения выбранного оператора в цикле for. На последнем изображении желтым цветом выделены редактируемые поля, доступ к которым осуществляется с помощью клавиши TAB. Дополнительные сведения см. в статье Фрагменты кода.
Добавить класс
Добавьте новый класс из меню Проект или контекстного меню в обозревателе решений:
Можно также использовать мастер классов для изменения или просмотра существующего класса.
Рефакторинг
Рефакторинг доступен в контекстном меню быстрых действий. Или можно щелкнуть лампочку в редакторе. Некоторые также находятся в меню Правка > Рефакторинг. Эти функции включают перечисленные ниже.
Применение стиля кода с помощью ClangFormat и EditorConfig
В Visual Studio, начиная с версии 2017, реализована поддержка ClangFormat — популярной служебной программы для форматирования кода C++ на основе Clang/LLVM. Введите ClangFormat в поле быстрого запуска, чтобы настроить использование одного из следующих распространенных форматов:
Эти файлы легко использовать совместно с помощью системы управления версиями, следовательно, вы можете применять соглашения о написании кода во всей группе разработчиков.
Visual Studio, начиная с версии 2017, также поддерживает EditorConfig — программу, которая работает аналогичным образом. Однако ClangFormat имеет больше параметров стиля, чем EditorConfig, включая правила, относящиеся к C++. С помощью EditorConfig вы можете создавать и размещать файлы .editorconfig в разных папках вашей базы кода, чтобы определять стили кода для этих папок и подпапок. Файл .editorconfig заменяет все другие файлы .editorconfig в родительских папках, перезаписывая все параметры форматирования, которые можно настроить, выбрав Средства > Параметры. Вы можете задать правила, определяющие использование табуляции и пробелов, настраивающие размер отступов и многое другое. См. подробнее о создании переносимых настраиваемых параметров редактора с помощью EditorConfig.
Другие параметры форматирования
Поле быстрого запуска — это самый быстрый способ найти нужный параметр или средство. Поле расположено в главном меню. Просто начните ввод и список автоматического завершения отфильтрует результаты.
Чтобы задать параметры форматирования, например отступы, завершение скобок и раскраску, введите C++ Formatting (Форматирование C++) в поле быстрого запуска.
Другие параметры форматирования можно настроить в главном меню, выбрав Изменить > Дополнительно.

Экспериментальные функции, которые могут присутствовать или отсутствовать в будущих версиях Visual Studio, можно найти в диалоговом окне экспериментальных функций C++ для текстового редактора. В Visual Studio, начиная с версии 2017, в этом диалоговом окне можно включить прогнозную технологию IntelliSense.
Рефакторинг кода в Visual Studio
Существует много способов вызвать инструменты для рефакторинга в системе Visual Studio 2013, включая контекстное меню, которое открывается после щелчка правой кнопкой мыши, интеллектуальные дескрипторы и меню Refactor в главном меню (только для разработчиков, работающих на языке программирования C#).
На рисунке ниже показано контекстное меню Refactor, предназначенное для разработчиков, работающих на языке программирования C#. Полный список действий по рефакторингу, доступных для разработчиков C# в системе Visual Studio 2013, включает операции Rename, Extract Method, Encapsulate Field, Extract Interface, Remove Parameters и Reorder Parameters. Можно также использовать операции Generate Method Stub и Organize Usings, которые с некоторой натяжкой также можно отнести к рефакторингу.
Встроенная поддержка рефакторинга, предлагаемая системой Visual Studio 2013 для разработчиков проектов на языке VB, ограничена символическими методами Rename и Generate Method Stub.
Операции рефакторинга
В следующих разделах описывается каждая из операций рефакторинга и приводятся примеры использования встроенной поддержки рефакторинга в языках C# и VB.
Операция Extract Method
Чтобы начать рефакторинг длинного метода, лучше всего разбить его на несколько небольших частей. Для этого необходимо выделить область кода, которую разработчик хочет удалить из исходного метода, и выбрать команду Extract Method из контекстного меню. В языке C# это приведет к появлению приглашения ввести имя нового метода, как показано на рисунке ниже. Если в удаляемом блоке кода есть переменные, которые использовались ранее, они автоматически становятся переменными в сигнатуре нового метода. После подтверждения имени нового метода его код вставляется сразу после исходного метода. Удаленный блок метода заменяется вызовом нового метода.
Например, в следующем сниппете, для того чтобы вынести условное логическое выражение в отдельный метод, необходимо выделить код и выбрать команду Extract Method из контекстного меню, появляющегося после щелчке правой кнопкой мыши:
На этом месте автоматически генерируется следующий код:
Операция Encapsulate Field
При рефакторинге часто требуется инкапсулировать в существующий класс некое свойство. Для этого предназначена операция Encapsulate Field. Чтобы выполнить это действие, следует выбрать переменную, которую требуется инкапсулировать, и выбрать соответствующую команду в контекстном меню. Это дает разработчику возможность указать свойство и выбрать место, в котором следует искать ссылку на него:
На следующем шаге после указания нового свойства следует определить, какие ссылки на переменную класса следует заменить ссылкой на новое свойство. Откроется окно предварительного просмотра по завершении поиска ссылок. В верхней панели окна размещено дерево, в котором указываются поля и методы, имеющие ссылки на данную переменную. Флажок, расположенный после каждой строки, указывает, следует ли выполнять замену. Выбрав строку в верхней части окна, необходимо установить на нее фокус в нижней панели. Как только будет обеспечена корректность каждой ссылки, инкапсуляция считается завершенной. Переменная класса устанавливается закрытой, а соответствующие ссылки обновляются.
Операция Extract Interface
По мере того как проект проходит этапы развития от прототипа на ранней стадии разработки до полной реализации или стадии роста, часто возникает необходимость выделить основные методы в виде интерфейса, доступного другим приложениям, или определить границы между непересекающимися системами. Прежде для этого приходилось копировать весь метод в новый файл и удалять его содержимое, оставляя лишь заглушку интерфейса. Операция рефакторинга Extract Interface позволяет извлечь интерфейс, используя любое количество методов в классе. При выполнении этой операции открывается диалоговое окно, показанное на рисунке ниже, которое позволяет пользователю выбрать метод, который он хочет включить в интерфейс. После того как разработчик сделает выбор, эти методы добавляются в новый интерфейс. Кроме того, новый интерфейс добавляется в исходный класс.
В следующем примере требуется извлечь в отдельный интерфейс первый метод:
После выбора команды Extract Interface из контекстного меню, появляющегося после щелчка правой кнопкой мыши, и выбора метода ShouldBeInInterface, подлежащего извлечению, в диалоговом окне Extract Interface (как показано на рисунке выше), в новом файле возникает новый интерфейс, а исходный файл обновляется следующим образом:
Операция Reorder Parameters
Иногда требуется переупорядочить параметры. Часто это делают по «косметическим» причинам, но эта операция может помочь повысить читабельность и иногда является необходимой при реализации интерфейсов.
Диалоговое окно Reorder Parameters dialog, показанное на рисунке ниже, позволяет переставлять параметры в списке в соответствии с требуемым порядком:
Как только требуемый порядок будет достигнут, пользователь может предварительно просмотреть результат. По умолчанию параметры в каждом вызове данного метода переставляются автоматически в соответствии с новым порядком. Диалоговое окно Preview, аналогичное показанному на рисунке, позволяет контролировать обновление вызовов метода.
Операция Remove Parameters
Удаление параметра из метода с помощью соответствующей операции рефакторинга значительно сокращает объем поиска ошибок компиляции, которые могут при этом возникнуть. Кроме того, эта операция очень полезна при многочисленных перегрузках метода, при которых удаление параметра не может порождать ошибки компиляции. В этом случае ошибка во время выполнения программы может возникнуть только по семантической, а не по синтаксической причине.
На рисунке ниже показано диалоговое окно Remove Parameters, которое используется для удаления параметров из списка параметров. Если параметр был удален непреднамеренно, его легко восстановить. Как указывает предупреждение, размещенное в этом диалоговом окне, удаление параметров часто приводит к неожиданным функциональным ошибкам, поэтому важно контролировать внесенные изменения. Для того чтобы оценить внесенные изменения, можно снова использовать окно предварительного просмотра.
Операция Rename
Система Visual Studio 2013 обеспечивает переименование переменных, методов и классов как в языке C#, так и в языке VB. Диалоговое окно Rename для языка C# приведено на рисунке ниже; оно довольно похоже на соответствующее окно для языка VB, хотя в нем нет функции поиска комментариев или строк.
В отличие от поддержки переименования переменных в языке предусматривающей использование окна предварительного просмотра, в котором можно было подтвердить внесенные изменения, функции переименования в языке VB просто переименовывают все ссылки на данную переменную.
Операция Generate Method Stub
Когда разработчик пишет код, он может прийти к выводу, что ему нужен вызов метода, который еще не написан. Например, следующий сниппет иллюстрирует новый метод, который должен быть сгенерирован на более поздней стадии:
Разумеется, этот код порождает ошибку при сборке, поскольку вызываемый метод еще не определен. Используя операцию рефакторинга Generate Method Stub (доступную с помощью интеллектуального указателя в самом коде), можно сгенерировать заглушку метода. Как видно из следующего примера, заглушка метода содержит входные параметры и тип возвращаемого значения:
Меню Organize Usings
Очень полезно поддерживать упорядоченный список директив using в каждом файле (на языке C#) и ссылаться только на те пространства имен, которые действительно необходимы в данном файле. Команда Organize Usings, доступная в контекстном меню, которое открывается после щелчка пользователем правой кнопкой мыши в окне редактора кода, поможет в обоих этих случаях:
Разработчики проектов на языке VB не имеют возможности упорядочивать и удалять неиспользуемые инструкции Imports. Однако на закладке References в диалоговом окне Project Properties можно пометить пространства имен, которые должны быть импортированы в каждый исходный файл. Это позволит значительно сократить количество инструкций Imports. На этой странице можно также удалить ссылки на неиспользуемые сборки.
Если для пространству имен задано альтернативное имя, то оно переносится в конец списка, а если в проекте используются альтернативные имена внешних сборок (с помощью ключевого слова extern в языке C#), то они перемещаются в начало списка.
Файлы шаблонного кода, предусмотренные в системе Visual Studio по умолчанию, содержат директивы using в начале файла за пределами блока пространства имен. Однако, согласно принципам стиля StyleCop, директивы using должны содержаться в блоке пространства имен. Операция Organize Usings распознает текущее расположение инструкций using в файле и оставляет их на месте.