Рефакторинг в Visual StudioАвтор: Виктор Деревянко Опубликовано: 23.09.2008 Источник: SoftKey.info Рефакторинг - это такой процесс изменения кода программы, при котором улучшается ее внутренняя структура, а внешнее поведение не изменяется. Другими словами, это способ приведения кода в порядок, при котором шансы появления новых ошибок в коде минимальны.
Изменения при рефакторинге кода вносятся пошагово, мелкими операциями. Переименовать функцию, разбить ее на несколько подфункций, изменить сигнатуру метода - все эти операции легко выполнить так, чтобы не занести в код ошибок. Однако совокупный эффект ряда таких элементарных операций может быть весьма значительным - от упрощения структуры кода, до полного изменения архитектуры разрабатываемой программы.
Особую популярность рефакторинг приобрел в последние десять лет с развитием экстремального программирования и других agile-методик программирования, в которых рефакторинг является частью цикла разработки программного обеспечения. Между тем, проведение рефакторинга вручную - достаточно утомительное занятие. Например, чтобы изменить порядок следования параметров в методе класса, мало изменить сигнатуру метода - необходимо пройти по всему коду программы и модифицировать все вызовы данного метода. Изменение тривиальное, но требует активного "копипастинга".
Спрос рождает предложение, и в последние годы производители средств разработки стали внедрять в свои программные продукты средства, автоматизирующие и упрощающие проведение рефакторинга. Среда Visual Studio впервые обзавелась такими средствами в версии VS2005. Разработчики, использующие C# и J#, получили в свое распоряжение следующий набор инструментов:
- Rename - переименование имени переменной, метода, класса и т.п. с автоматическим обновлением всех ссылок на это имя в коде;
- Extract method - оформление выделенной части кода в новый, отдельный метод;
- Encapsulate field - создание свойства, скрывающего выбранную переменную-член класса;
- Extract interface - создание интерфейса на основе списка методов класса;
- Promote local variable to parameter - вынесение локальной переменной в параметр метода;
- Remove/Reorder parameters - удаление параметров метода и изменение порядка их следования с автоматическим обновлением всех ссылок в коде на данный метод.
Реализованный набор инструментов, конечно же, упростил жизнь разработчикам, однако он далеко не идеален. Из недостатков можно отметить:
- отсутствие поддержки C++ и VB (в VS2008 ее все так же нет);
- достаточно медленная работа - вызов любой операции рефакторинга приводит к появлению диалога обновления IntelliSense и разработчик вынужден ждать, причем порой довольно долго, пока этот диалог завершит работу;
- набор средств рефакторинга минимален, ряд полезных инструментов в нем отсутствует;
- интерфейс далеко не самый эргономичный и требует активного использования мышки.
К счастью, в Microsoft Visual Studio издавна реализована прекрасная поддержка плагинов, с помощью которых можно расширять ее возможности. В частности, существует множество плагинов, как платных, так и бесплатных, дополняющих и улучшающих стандартный набор инструментов рефакторинга в студии. Попробуем разобраться, кто из них что умеет.
Visual Assist 10.4.1647.0
Visual Assist X - плагин, разработанный фирмой Whole Tomato Inc. Плагин поддерживает три языка программирования - C++, C# и VB.NET и работает практически во всех версиях студии, начиная c Visual C++ 6.0 (не поддерживаются только Express-версии, для которой реализация плагинов запрещена лицензионным соглашением).
 | | Диалог функции Rename в Visual Assist X |
Набор средств рефакторинга, предлагаемых Visual Assist X, является общим для всех языков и включает аналоги стандартных инструментов "Rename", "Extract Method", "Encapsulate Field", новые инструменты "Change Signature", "AddMethod", "Add Similar Member" и "Document Method". Для разработчиков С++ так же доступны функции "Create Declaration", "Create Implementation" и "Move Implementation to Source File".
Инструменты рефакторинга Visual Assist X работают существенно быстрее стандартных. Их интерфейс все так же основан на использовании модальных диалогов, однако он во многом более эргономичен. Например, при вызове функции "Rename" показывается один диалог, а не два - предпросмотр совмещен с вводом нового имени. Функция "Change Signature" позволяет изменять сигнатуру метода произвольным образом, что гораздо удобнее, чем тыкать мышкой по списку параметров в стандартных диалогах "Remove Parameter" и "Reorder Parameters".
Visual Assist реализует удобный способ быстрого вызова инструментов рефакторинга - достаточно навести мышкой на выделенный текст или любой идентификатор, как рядом с курсором мыши появляется иконка, при нажатии на которую открывается меню со списком доступных для выбранного участка кода методов рефакторинга.
Рефакторинг в Visual Assist является кросс-проектным, причем даже в тех случаях, когда проекты написаны на разных языках. Шаблоны генерируемого при рефакторинге кода настраиваются в настройках. Команда UNDO позволяет отменить изменения, внесенные в код при рефакторинге, причем все изменения отменяются скопом, "в один клик".
Refactor! и Refactor! Pro 3.0.8
Компания Developer Express, разработчик небезызвестного плагина CodeRush, разработала целый набор плагинов для рефакторинга - три бесплатных плагина Refactor! для C++, Visual Basic и ASP.NET и один платный - Refactor! Pro, поддерживающий восемь языков C#, Visual Basic, C++, ASP.NET, XAML, XML, HTML, JavaScript. Плагины способны работать в VS2002-VS2008. Платная версия реализует в общей сложности около 150 инструментов рефакторинга, функциональность бесплатных плагинов несколько более скромная - 15 инструментов для С++, 36 для VB, 28 для ASP.NET.
 | | Бездиалоговый интерфейс Refactor! |
Так же как Visual Assist, Refactor! показывает иконку, открывающий меню со списком доступных, для выбранного участка кода, методов рефакторинга. Однако, интерфейс инструментов рефакторинга в Refactor! отличается принципиально - он является бездиалоговым, интерактивным и анимированным. Достаточно выбрать в списке методов рефакторинга требуемый, как Refactor! отобразит всплывающую подсказку с инструкциями какие клавиши нажимать и покажет каким образом при этом будет изменен код. Когда требуется вводить текст, например, новое название переменной, пользователь делает это прямо в редакторе студии - Refactor! автоматически изменяет все ссылки на эту переменную в коде программы.
Сравнительное тестирование бесплатной и платной версии Refactor! для С++ показало, что бесплатная версия не только обладает меньшим количеством функций, но и работает как-то менее уверенно. В процессе работы очень часто для выбранных участков кода не было доступно никаких инструментов рефакторинга, даже тривиального Rename. В платной версии такого не наблюдалось.
ReSharper 4.0
ReSharper - плагин, разработанный фирмой JetBrains, предназначенный для разработчиков, использующих C# и VB.NET и предоставляющий огромный набор разнообразных полезных функций, в число которых входят и средства рефакторинга.
Так же как Visual Assist и Refactor!, ReSharper умеет показывать контекстно-зависимое меню со списком инструментов рефакторинга, доступных для выбранного участка кода. Для вызова меню используется комбинация клавиш Ctrl+Shift+R. Это удобно - вызов любого инструмента рефакторинга всегда выполняется с помощью одной и той же комбинации клавиш.
Инструменты рефакторинга в ReSharper имеют диалоговый интерфейс, однако диалоги немодальные. Немного напрягает отсутствие возможности предварительного просмотра в некоторых диалогах. Впрочем, внесенные изменения при необходимости легко отменить - одна команда UNDO отменяет всю проведенную операцию рефакторинга целиком.
Всего доступно 34 метода рефакторинга, включая такие как "Move Type to Another File", "Inline variable", "Copy Type" и "Extract Superclass". Реализованы они на хорошем уровне, пользоваться ими удобно.
 | | Контекстные действия в ReSharper |
Помимо собственно средств рефакторинга, ReSharper предоставляет огромный набор так называемых контекстных действий (context actions). Фактически - это мелкие операции по преобразованию кода, находящегося в позиции курсора. Например изменить область видимости текущего метода или конвертировать цикл foreach в цикл for.
Для вызова списка доступных в текущем контексте действий достаточно нажать Alt+Enter или щелкнуть по значку лампочки, появляющемуся в начале строки.
JustCode! 1.1
Плагин JustCode!, разработанный фирмой Omnicore, представляет из себя альтернативу ReSharper и Refactor! Плагин поддерживает VS2003 и VS2005, языки C#, J#, VB.NET, ASP.Net, JavaScript и HTML.
 | | Бездиалоговый интерфейс JustCode!. Процесс переименования переменной |
Набор операций рефакторинга, доступных в плагине, не слишком велик - "Rename", "Inline variable", "Extract Method", автоматическое создание конструктора и преобразование переменной-члена класса в свойство.
Интерфейс JustCode! схож с интерфейсом Refactor!, правда в нем поменьше анимации. Точно так же набор доступных инструментов рефакторинга зависит от текущего контекста. Диалоговых окон нет, все операции рефакторинга можно проводить используя исключительно клавиатуру.
К плюсам плагина относится кросс-проектность и кросс-языковость рефакторинга. К минусам - неполноценная реализация команды отмены операции рефакторинга - каждое изменение в коде нужно отменять отдельным вызовом UNDO.
Скорость работы плагина вполне на уровне, никаких особых "тормозов" в работу студии он не вносит. Однако бездиалоговый интерфейс в JustCode! пока отлажен не так четко, как в Refactor!, к нему приходится приноравливаться.
CodeIt.Once 1.2.07303
Плагин CodeIt.Once разработан фирмой Submain и предназначен исключительно для проведения рефакторинга. Поддерживает языки C# и VB.NET, способен работать с VS2003 и VS2005.
 | | Rename в Code.Once |
Codeit.Once реализует 14 инструментов рефакторинга. Несколько неожиданным является их интерфейс, установленный по умолчанию - многошаговые визарды (wizards), прямо скажем, не самый быстрый вариант интерфейса. К счастью, режим использования визардов можно отключить в настройках, после чего интерфейс становится диалоговым, напоминающим Visual Assist. Диалоги весьма компактны, удобны в работе и имеют функцию предпросмотра.
Скорость и качество работы методов рефакторинга в Codeit.Once не вызывают нареканий. Команда Undo реализована грамотно - отменяет в коде сразу все изменения, внесенные при выполнении операции рефакторинга.
Resource Refactoring Tool
Resource Refactoring Tool бесплатный плагин, автоматизирующий одну единственную функцию: перенос строк, жестко зашитых в код, в файл ресурсов. Он поддерживает языки C# и VB.NET, работает в VS2005/2008 во всех типах проектов, включая web-приложения.
TytanNET v0.14
Плагин TytanNET так же бесплатен. Поддерживает языки C#, VB.NET, Managed C++, способен работать в VS2005/2008. Текущая версия предоставляет всего четыре метода рефакторинга, однако в следующей версии их будет больше. Стоит отметить, что скорость работы плагина пока оставляет желать лучшего.
В заключение
В заключение хотелось бы отметить два момента.
Во-первых, все рассмотренные выше плагины занимаются фоновым анализом кода, многие из них - его фоновой компиляцией. Так что устанавливать слишком большое количество плагинов одновременно не рекомендуется - можно получить серьзное замедление работы Visual Studio.
Во-вторых, рефакторинг - это палка о двух концах. С одной стороны - нужен набор инструментов для его проведения, с другой - не помешает набор средств, позволяющих автоматически выявлять места кода, нуждающиеся в проведение рефакторинга. Такие инструменты в наше время то же есть. Тем кто заинтересуется можно порекомендовать обратить внимание на NDepend, FXCop и Reflector и, конечно же, заглянуть на сайт www.visualstudiogallery.com, на котором представлена масса полезных плагинов для Visual Studio.
|