`

СПЕЦИАЛЬНЫЕ
ПАРТНЕРЫ
ПРОЕКТА

Архив номеров

Как изменилось финансирование ИТ-направления в вашей организации?

Best CIO

Определение наиболее профессиональных ИТ-управленцев, лидеров и экспертов в своих отраслях

Человек года

Кто внес наибольший вклад в развитие украинского ИТ-рынка.

Продукт года

Награды «Продукт года» еженедельника «Компьютерное обозрение» за наиболее выдающиеся ИТ-товары

 

Реструктуризация кода: первые шаги

0 
 

Когда разработчику становится ясно, какой должна быть структура создаваемой им программы? Каждому хотелось бы, чтобы такое понимание приходило в начале работы и направляло все дальнейшие усилия по созданию кода. Однако будем реалистами: нередко в нашем представлении идеальный вариант программы складывается лишь тогда, когда написана и отлажена ее действующая версия, структуру которой никак нельзя назвать изящной.
Попробуем проанализировать типичный код "готовой" программы. Где-то в нескольких местах повторяется одна и та же последовательность команд. Заменив ее вызовом метода, можно сделать код более удобным для понимания. Или, напротив, объявленный метод кажется излишним; более целесообразно реализовать выполняемые им действия внутри вызывающего метода. А вот два класса настолько похожи друг на друга, что удивляешься, поч ему в процессе разработки не пришла в голову мысль оформить их как подклассы одного родительского класса.

Реструктуризация кода первые шаги
Все-таки интеллект JRefactory не настолько силен, чтобы все решать самостоятельно
Продолжаем рассмотрение исходного кода и обнаруживаем, что одно и то же выражение с завидным постоянством возникает в правой части оператора прямого присваивания -- единожды вычислив его и заменив переменной, мы смогли бы повысить производительность программы. Пусть скорость выполнения возрастет всего лишь на доли процента, но почему бы не сделать этого? Главное же, что подобные, на первый взгляд незначительные "улучшения" кода нередко существенно упрощают его последующее сопровождение.

Одним словом, готовую программу надо слегка "переписать", но так, чтобы функционирование ее не нарушилось -- ведь она исправно выполняет свои "обязанности"! Поэтому речь идет, конечно же, не столько о переписывании, сколько о реструктуризации (refactoring) -- изменении структуры кода при полном сохранении работоспособности и функциональных возможностей.

На сайте www.refactoring.com/catalog/index.html перечислены более 90 различных приемов реструктуризации. Конечно, работу по упорядочению программы можно поручить и программисту, в конце концов именно он отвечает за конечный результат. Но сколько времени потратит квалифицированный специалист на выполнение рутинных операций! При этом, как бы внимательно он ни работал, в готовый код будут неизбежно внесены ошибки, вследствие чего придется снова заниматься отладкой. Поэтому крайне удобно и желательно применение специализированных инструментальных средств.

Реструктуризация кода первые шаги
RefactorIt может быть и подключаемым модулем, и отдельной программой
В настоящее время число программ, предназначенных для реструктуризации, относительно невелико. Первые инструменты подобного плана появились для языка Smalltalk, но сейчас несомненным лидером в этой области является Java. Помимо инструментов, специально созданных для этой цели, средства реструктуризации реализованы и в некоторых интегрированных средах разработки. Так, например, в меню JBuilder, одного из наиболее популярных в настоящее время пакетов для подготовки Java-программ, присутствуют пункты именно для выполнения простейших действий по реструктуризации кода.

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

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

double sum = 0;
for (int i = 0; i < size; i++)

sum += mas[i];

Чтобы сделать код удобочитаемым, вы решили оформить этот фрагмент в виде метода. (Естественно, данная ситуация надумана, но ограниченный размер статьи не позволяет привести более содержательный пример.) Пометив строки, выбираете пункт меню Edit->Extract Method и в появившемся диалоговом окне вводите имя метода, телом которого и должен стать указанный фрагмент. После этого в составе текущего класса появляется новый метод, а вместо выделенных строк будет вставлен его вызов.

И тут вас ждет первое разочарование. Совершенно очевидно, что созданный метод обязан возвращать вычисленное значение, но, тем не менее, он имеет тип
void

, к тому же в нем не предусмотрены никакие параметры. Определение переменной
sum

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

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

, то при этом, скорее всего, не возникнет никаких проблем (правда, время, сэкономленное в результате применения данного приема, составляет считанные минуты, но из них-то и складываются часы, которых так недостает на завершающем этапе проекта).

Но если стандартные встроенные средства вас не устраивают, можно использовать специализированные инструменты, ориентированные исключительно на реструктуризацию кода. Кстати, многие из них реализованы в виде дополнительных модулей для интегрированных сред разработки, в том числе и для JBuilder. Например, если добавить к JBuilder модуль JRefactory (jrefactory.sourceforge.net), то список поддерживаемых приемов реструктуризации увеличится вдвое. Вы получите возможность перемещать методы из текущего класса в суперкласс или в подкласс, создавать на базе текущего класса интерфейс и выполнять другие подобные действия.

После непродолжительной работы с JRefactory становится ясно, что это именно самостоятельный инструмент, а не набор второстепенных средств, не удостоившихся достаточного внимания разработчиков. Так, если мы попытаемся оформить в виде метода приведенные выше строки кода, то увидим, что данный продукт гораздо более "ответственно" относится к выполнению поставленной задачи. JRefactory стремится выявить переменные, которые необходимо передать вновь созданному методу в качестве параметров, и, что очень важно, самостоятельно ищет все фрагменты кода, совпадающие с отмеченным. Правда, решить, каким должен быть тип возвращаемого значения, JRefactory не по силам, поэтому право выбора типа метода предоставляется разработчику.

Однако JRefactory также работает далеко не идеально. Чтобы убедиться в этом, достаточно слегка видоизменить приведенный выше фрагмент кода:

double sum = 0;
int i;
for (i = 0; i < size; i++)

sum += mas[i];

Это приводит к тому, что переменная
i

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

JRefactory -- не единственный инструмент для реструктуризации. Так, например, jFactor представляет собой дополнительный модуль к VisualAge и поддерживает около 30 приемов модификации структуры кода. Если же вам необходим инструмент, реализованный в виде отдельного приложения, то стоит обратить внимание на RefactorIt. Этот продукт обеспечивает также совместную работу с NetBeans, Forte, JDeveloper и JBuilder. На первый взгляд может показаться, что применение независимой программы придает дополнительную гибкость. Однако, отказавшись от связывания RefactorIt со средой разработки, вы встретитесь с новыми проблемами. Как показывает опыт, сформировать проект для конкретного приложения достаточно трудно.

Более полный перечень продуктов, предназначенных для реструктуризации кода, приведен в документе www.refactoring.com/tools.html. Пока их можно пересчитать по пальцам, и все они фактически являются экспериментальными образцами. Каждый имеет свои преимущества и, конечно же, недостатки -- ведь данная технология только делает свои первые шаги. Но, несмотря на то что на сегодняшний день применяемость инструментов реструктуризации крайне ограничена, нет никаких сомнений, что в ближайшем будущем они станут полноценными помощниками разработчиков, а список поддерживаемых ими языков и интегрированных сред разработки существенно расширится.
0 
 

Напечатать Отправить другу

Читайте также

 
 
IDC
Реклама

  •  Home  •  Рынок  •  ИТ-директор  •  CloudComputing  •  Hard  •  Soft  •  Сети  •  Безопасность  •  Наука  •  IoT