Логин:   Пароль:






Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100
Rambler's Top100

Java: IDEОбзор средств автоматизированного рефакторинга в Java IDE

Обзор средств автоматизированного рефакторинга в Java IDE

Содержание

  1. Цель
  2. Коротко о рефакторинге
  3. Автоматизированный рефакторинг
  4. Общие сведения обо всех Java IDE, поддерживающих рефакторинг
  5. Ситуация на рынке Java IDE
  6. Рефакторинг в Intellij Idea
  7. Рефакторинг в Eclipse
  8. Рефакторинг в Sun NetBeans
  9. Выводы
  10. Приложение 1. Сравнительная таблица методов рефакторинга для языка Java
  11. Приложение 2. Использованная литература и ресурсы, упоминаемые в статье

Цель

В этой статье я хочу коротко описать текущее положение дел с рефакторингом в современных Java IDE. Материал не преследует образовательных целей как в области рефакторинга как такового, так и XP (extreme programming) и написания тестов (JUnit etc). В статье описывается состояние рефакторинга вообще в Java IDE и приводятся особенности его реализации для 3-х наиболее популярных.

Коротко о рефакторинге

«Рефакторинг – процесс изменения внутренней структуры ПО с целью облегчения понимания ее структуры и упрощения дальнейшей модификации без изменения внешнего поведения.» Это определение взято из книги, положившей начало современному представлению об этом процессе – «Рефакторинг - Улучшение существуещего кода» Мартина Фаулера (Refactoring: Improving the Design of Existing Code by Martin Fowler, Addison Wesley 1999)[1]. Кроме того, рефакторинг может применяться не только к исходному коду на каком либо языке программирования, но также к описательным языкам, если не теряется результат их обработки[2].

Сам процесс рефакторинга появился задолго до выхода в свет книги и стал ответом на необходимость поддерживать большие объемы кода коллективами программистов в адекватном состоянии качества.

Всем известно, что каждый программист пишет программу в своем, привычном для него стиле, отличающимся от стиля коллег, а также от канонического стиля, предложенного авторами языка. Стиль может выражаться в именовании, использовании тех или иных конструкций, типизации и т.д. На это можно не обращать внимания до тех пор, пока его код не берется поддерживать другой программист. Когда же это происходит, зачастую, многие просто переписывают заново уже работающий код, мотивируя следующим образом: «он был ужасен, к тому же я его плохо понимал».

Кроме того, существует проблема «неповоротливости» – чем больше программа, тем сложнее вносить в нее принципиальные изменения и тем сложнее прогнозировать последствия этих изменений. Из этого вытекает увеличение времени на модификацию программы. Менеджеру чрезвычайно сложно объяснить, почему аналогичный объем работы полгода назад выполнялся за неделю, а сейчас - за 2. Все из-за того, что после написания в код вносится некоторое количество изменений, вследствие чего он теряет начальную простоту, элегантность и ясность.

Эти проблемы программисты пытались решить общими способами – путем модификации структуры программы без изменения ее функциональности. Например, переименовывали методы в соответствие с общей политикой, меняли видимость и расположение классов и т.д. Все это теперь называется методами рефакторинга.

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

Автоматизированный рефакторинг

Изучив статьи о рефакторинге или даже прочитав книгу Фаулера, можно сделать вывод о том что, наконец, найдено решение вышеназванных проблем. Но, начав использование принципов рефакторинга на практике, программист замечает, что на его плечи легла еще одна ноша – рефакторинг тоже требует времени и внимательности!!! Причем, применяя методы рефакторинга на отдельном участке кода, и не применяя на остальных, программист дополнительно запутывает код. Либо, поменяв интерфейс класса, получает множество ошибок в других частях, модулях программы. Разные методы требуют разного времени на их применение, особенно это касается интерфейсов класса.

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

Это были либо Java среды разработки, либо плагины к ним. Это вызвано тем, что реализация рефакторинга базируется на семантическом представлении программы. К тому же рефакторинг тесно переплетен с написанием кода. Все современные IDE, независимо от компилятора (или же используя его API), имеют представление о коде для подсветки синтаксиса и таких функций, как автодополнение.

Следовательно, не составило особого труда, добавить визуальных помощников, реализующие основные методы рефакторинга.

Общие сведения обо всех Java IDE, поддерживающих рефакторинг

В данный момент, IDE практически все крупных производителей имеют в своем арсенале базовый набор методов рефакторинга. Как правило, они предлагаю его с помощью пункта главного меню Refactoring, а также, с помощью контекстных меню и «горячих» клавиш.

Многие среды, поддерживающие рефакторинг, предлагают методы контроля над проводимыми изменениями, такие как «Предварительный просмотр» и «Атомарная отмена операции».

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

Атомарная отмена операции незаменима в том случае, если изменения вносятся сразу в нескольких участках кода. В случае отмены, программист может вернуть код к исходному состоянию за один раз.

Практически во всех интегрированных средах реализован рефакторинг для языка Java. Наиболее распространенными классами автоматизированных методов являются следующие:

  • Изменение имени и физической организации кода - переименование полей, переменных, классов, интерфейсов, перенос пакетов и классов;
  • Изменение логической организации кода на уровне класса – преобразование класса вложенный<->верхнего уровня, преобразование класс<->интерфейс, перемещение методов в подкласс или суперкласс;
  • Изменение кода внутри класса – перемещение переменных из методов в класс, преобразование участка кода в метод.

В таблице 1 содержится информация о том, в каком объеме реализованы вышеназванные методы в перечисленных в статье средах разработки.

Кроме этого, сюда нельзя не добавить возможность безопасного удаления классов, методов, полей.

Некоторые IDE предлагают безопасное изменение интерфейсов классов не только для Java, но и для сопутствующих технологий, таких как JSP, например, при перемещении класса, меняется его полное имя в JSP скриптлете или в описательном файле Apache Struts.

После выхода Java SE 5 и появления нового упрощенного синтаксиса, появилась потребность перевода кода, написанного для предыдущих версий языка на использование новых конструкций.

Ситуация на рынке Java IDE

Сейчас на рынке Java IDE сложилась очень интересная ситуация. Некоторое время назад производители инструментария выяснили, что продажа средств разработки по огромным ценам, во-первых, не приносит ожидаемой прибыли, а во-вторых, отталкивает разработчиков от других продуктов компании (родные среды наилучшим образом поддерживают другие разработки компаний).

Руководствуясь этими соображениями, в разное время, в последние 5 лет, такие компании как Sun, IBM, Oracle решили сделать бесплатные версии своих IDE – как дополнение (Sun) или замещение существующих (JDeveloper). Кроме был предоставлен исходный код продуктов и предприняты шаги по привлечению сторонних разработчиков, помогающих совершенствовать эти среды.

Так были образованы сообщества NetBeans.org, Eclipse Foundation. В них состоят как штатные, fulltime разработчики, так и энтузиасты, которые являются также, глашатаями и пропагандистами как самих IDE так и других продуктов компании. А компании теперь зарабатывают на консультационных услугах, платной поддержке.

Лишь 2 игрока рынка продают свои продукты – JetBrains и Borland, но последняя недавно заявила о продаже своего IDE бизнеса, причем это коснется не только Java среды, но и всех остальных.

Налицо наличие системного кризиса в бизнесе, построенном на продаже языковых сред программирования. Среди его причин снижение покупательской активности в этом сегменте рынка и перетекание потребителей на бесплатные среды (которые явились результатом агрессивной политики компаний по продвижению своих продуктов).

И так, рынок Java IDE с поддержкой рефакторинга представляют следующие игроки:

  • Eclipse Foundation с Eclipse 3.1.2;
  • JetBrains с IntelliJ Idea 5.1;
  • Sun с NetBeans 5.0;
  • Oracle с JDeveloper 10.1.3;
  • Borland с JBuilder 2006.

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

Вот некоторые из них:

  • RefactorIt;
  • JFactor;
  • JRefactory.

Сегодня разработчик Java совершенно бесплатно получает мощную IDE с возможностями рефакторинга и, при необходимости, может расширить их с помощью плагинов.

Рефакторинг в Intellij Idea

Эта IDE[3], отличается от остальных необычной для интегрированной среды компоновкой. Продуктовая линейка состоит из одной версии. В нее входит сама среда, обладающая самыми развитыми возможностями в области семантического анализа, а также набор плагинов, расширяющих ее функциональность в интеграции с фреймворками, серверами приложений и т.д. В последнее время значительно увеличилось количество плагинов сторонних производителей – как бесплатных, так и платных.

На уровне среды реализовано большинство общих методов рефакторинга для Java кода (см. таблицу 1). Также, поддерживается рефакторинг для JSP страниц, CSS файлов, JavaScript, HTML файлов.

Code Inspection и автоматизированный рефакторинг

В IntelliJ IDEA существует функция, отсутствующая в других IDE, а именно – Code Inspection (если не принимать в расчет связку с рефакторингом, нечто похожее интегрировано и в Eclipse). Основное назначение ее – автоматический анализ программы на предмет типичных или неприемлемых по разным причинам ошибочных приемов программирования.

Например, по технологиям:

  • Java SE: использование в Java SE 5 проекте конструкций из более ранних версии – цикл по всем элементам коллекции с помощью итератора и полного синтаксиса цикла, явное оборачивание/разворачивание элементарных типов, не параметризированное использование классов коллекций;
  • Java ME: использование Object[].length в условии цикла, инициализаторы массива большого размера;
  • Java EE: неправильное использование тегов и атрибутов в HTML и CSS.

После анализа программного кода пользователь, для некоторых inspection может выполнить предопределенные действия, например, использовать новый, упрощенный формат цикла в Java SE 5. Причем, преобразования среда выполнит сама – удалит переменную итератора, создаст переменную экземпляра коллекции и преобразует формат цикла.

Плагины

Наряду с базовыми возможностями IDE существуют плагины сторонних разработчиков. Например, Sixth & Red River Software предлагает целую линейку плагинов:

  • Refactor-J – дополняет существующие возможности такими как разделение классов, преобразования циклов – разделение и объединение, изменение входящих и исходящих параметров методов;
  • Refactor-X – добавляет поддержку рефакторинга XML кода – преобразование тег—атрибут, оборачивание—разворачивание тегов и удаление тегов и атрибутов.

Кроме них компания предлагает еще 2 очень интересных продукта – это Inspection-JS – code inspection для JavaScript и MetricsReloaded для измерения качества кода в числах (LOC, SLOC для Java, JSP, XML и HTML и другие).

Комбинирование code inspection с элементами рефакторинга дает в руки профессионалу невиданную раннее власть над большими объемами кода. Теперь существует возможность автоматизировано находить объекты применения некоторых методов рефакторинга, не прибегая к просматриванию кода.

Рефакторинг в Eclipse

Eclipse[4][5] представляет собой базовую платформу с набором плагинов. Эта платформа вообще не привязана ни к какому языку программирования.

В версии 3.0 было положено начало отделению средств обработки исходного кода от Java Development Tools (JDT), в который входили средства поддержки рефакторинга.

В рамках этого были выделены 2 плагина, отвечающих за независимую от языка поддержку рефакторинга:

  • org.eclipse.ltk.core.refactoring – отвечает за бизнес-логику рефакторинга;
  • org.eclipse.ltk.ui.refactoring – реализация пользовательского интерфейса.

В базовой поставке Eclipse существуют стандартные для Java IDE средства рефакторинга, представленные в меню Refactoring в Java Perspective. Они реализуют соответствующие методы применительно к Java.

Кроме классических методов стоит отметить “Infer generic Type Arguments”, позволяющий определить параметры для классов-шаблонов.

Поддержка остальных языков и технологий (например, JSP), реализована в соответствующих наборах плагинов:

  • WTP – Web Tools Project, представляющий набор плагинов для web разработки;
  • CDT – C++ Development Tools, набор плагинов для C++ разработки;
и т.д.

Так, например, в версии 1.5 Web Tools Project, планируемой к выпуску одновременно с Eclipse 3.2, планируется реализовать следующие методы рефакторинга:

  • Rename, Delete, Move применительно к классу с реализацией изменений в JSF и JSP станицах, использующих этот класс;
  • Rename, Delete применительно к JSP, JSF странице;
  • Rename, Delete применительно к методу или свойству Managed Bean с реализацией изменений в JSF странице.

В целом, проект Eclipse предлагает как базовую поддержку рефакторинга независимо от языка, так и довольно качественную поддержку для Java (см. таблицу 1). Для Java EE существует неполная реализация базовых методов, которая вскоре (с выходом Web Tools Project 1.5) будет существенно дополнена.

Рефакторинг в Sun NetBeans

Sun NetBeans[6] предоставляет базовые, стандартные возможности рефакторинга Java (см. таблицу 1).

Кроме того, при рефакторинге классов EJB, применяется система ограничений на применение методов рефакторинга, позволяющая сохранить целостность и корректность EJB, например, нельзя переименовывать обязательные для них методы, такие как ejbCreate.

Область применения методов рефакторинга для классов включает как Java классы, так и J2EE дескрипторы, но, к сожалению, не включает JSP страницы.

Project Jackpot

В среднесрочной перспективе ожидается существенное усиление позиций NetBeans в области автоматизированного рефакторинга за счет реализации долго разрабатываемого проекта Sun под названием Jackpot[7]. Суть проекта состоит в том, чтобы предоставить разработчику инструмент, сочетающий рефакторинг и rules engine. С его помощью можно будет инспектировать и, по необходимости, преобразовывать код с сохранением его корректности и работоспособности.

Инструмент должен выйти в виде бета версии к Java One 2006 и в виде релиза – осенью 2006 года, одновременно с NetBeans 6.0 и Java SE 6.

Выводы

На данный момент наиболее развитой, с точки зрения рефакторинга и анализа кода, является IntelliJ Idea, которая удерживает пальму первенства на протяжении нескольких лет с ее гибкими функциями code inspection и рефакторинга. Этого стоит ожидать от IDE, ориентированной на разработчика, предпочитающего кодирование.

За ней следует Eclipse, обладающая большим потенциалом, как платформа для многоязыковой разработки, большим дисциплинированным сообществом разработчиков. Поддержка рефакторинга организована на базовом уровне и легко может быть реализована для других языков, также легко могут быть добавлены новые методы рефакторинга. Реализация для Java обеспечена на приемлемом уровне.

За ними следуют остальные IDE, в которых реализованы базовые возможности рефакторинга, подкрепляемые с помощью плагинов сторонних производителей (зачастую, платных).

Существенный прорыв в этой области может состояться с выходом Jackpot для NetBeans, который, возможно будет портирован на другие IDE платформы и, возможно будет поддерживать другие языки программирования.

Приложение 1. Сравнительная таблица методов рефакторинга для языка Java

Метод
IntelliJ IDEA
Eclipse
Sun NetBeans
Rename
Shift+F6
Alt+Shift+R
Alt+Shift+R
Extract method
Ctlr+Alt+M
Alt+Shift+M
Ctrl+Shift+M
Change method parameters
Ctrl+F6
Alt+Shift+C
+
Encapsulate fields
+
+
+
Pull up
+
+
+
Pull down
+
+
+
Move Class
F6
Alt+Shift+V
Alt+Shift+V
Move inner to output level
+
+
+
Convert Anonymous Class to Inner
+
+
+
Extract interface
+
+
+
Extract superclass
+
 
+
Use supertype where possible
+
+
+
Safely delete
Alt+Delete
+
+
Make static
+
 
 
Convert to instance method
+
 
 
Copy
F5
 
 
Replace Method Code Duplicates
+
 
 
Introduce variable
Crtl+Alt+V
Alt+Shift+L
 
Introduce field
Ctrl+Alt+F
 
 
Introduce constant
Ctrl+Alt+C
+
 
Introduce parameter
Ctrl+Alt+P
+
 
Replace inheritance with delegation
+
 
 
Inline
Ctrl+Alt+N
Alt+Shift+I
 
Replace temp with query
+
 
 
Replace constructor with factory method
+
+
 
Generify template classes
+
+
 
Migrate packages
+
 
 

Приложение 2. Использованная литература и ресурсы, упоминаемые в статье

  1. Refactoring: Improving the Design of Existing Code by Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts, Addison-Wesley, 1999.
  2. Статья «Refactoring», wikipedia.org.
  3. IntelliJ Idea Homepage
  4. Eclipse Foundation Homepage
  5. Статья «Refactoring for everyone», David Gallardo (david@gallardo.org)
  6. NetBeans.org community
  7. Jackpot module Homepage





Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 11

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/books/show2b.php on line 30
Узнай о чем ты на самом деле сейчас думаешь тут.


[an error occurred while processing this directive]



Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 91

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/news/worldnews.php on line 95