Авторизируйтесь,
чтобы продолжить
Некоторые функции доступны только зарегистрированным пользователям
Неправильный логин или пароль
Добавить софт
Мой софт

Рефакторинг в 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
Диалог функции 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!
Бездиалоговый интерфейс 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
Помимо собственно средств рефакторинга, 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
Бездиалоговый интерфейс 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
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.



Статистика
Всего программ 28589
Скачиваний сегодня 389
Скачиваний вчера 1904