Архивы: по дате | по разделам | по авторам

Кодируй да радуйся

Архив
автор : Дмитрий Кириллов   13.10.2004

Именно так можно перевести официальный слоган «Develop with pleasure» среды разработки Java-приложений IntelliJ IDEA 4.5. Возникает вопрос: сколько «pleasure» можно получить от «develop» на практике? Оказывается, много.

Именно так можно перевести официальный слоган «Develop with pleasure» среды разработки Java-приложений IntelliJ IDEA 4.5. Возникает вопрос: сколько «pleasure» можно получить от «develop» на практике? Оказывается, много.

Идеи могут быть обезврежены только идеями.
Оноре де Бальзак

Разработка средств разработки — неблагодарное занятие сразу по нескольким причинам. Во-первых, конечный продукт будут оценивать самые придирчивые критики — коллеги по цеху. Во-вторых, решение о выборе IDE конкретного производителя зачастую принимают не разработчики, а лица, плохо разбирающиеся в тонкостях процесса, что мешает небольшим компаниям продвигать собственные продукты и дает значительную фору «монстрам» вроде Borland, чье имя у всех на устах. Наконец, в третьих, многие профессионалы предпочитают хороший текстовый редактор вроде Emacs вкупе с набором скриптов (batch, bash и т. д.) любой IDE (видимо, по идеологическим соображениям), тем самым ориентируя потребителей на продукты уровня «средний/ниже среднего». Исключение, пожалуй, составляет MS Visual Studio 6.0, работать в котором неудобно и «чайникам», и профессионалам (по личным наблюдениям автора) (Здесь следует оговориться: кодировать в Visual Studio 6 вполне удобно; речь идет о неудобствах, связанных с «дизайнером форм» MFC, концепцией отображения событий, управлением разработкой компонентов COM/Active X и т. п).

Еще одному исключению посвящена эта статья. Среда разработки IntelliJ IDEA (рис. 1) от компании JetBrains выгодно отличается от десятка других IDE для платформы Java. В первую очередь тем, что всё или почти всё в ней уместно, находится под рукой и дает о себе знать лишь при необходимости. И только во вторую — новаторскими идеями и удачными заимствованиями.

Инсталляция

…Шаг 20. Набираю в консоли ‘lilo’. Получаю: ‘Fatal:no images defined’.
Все это случилось потому, что я забыл изменить строку ‘default’ с ‘linux’ на ‘new’ в lilo.conf.
Из руководства по инсталляции ядра Linux версии 2.4

Будучи Java-приложением, соответствующим стандарту Pure Java, IntelliJ IDEA поддерживает платформы Windows 2000/NT/XP, Mac OS X и Linux. Ее дистрибутив для Windows занимает 53 Мбайт. После обычной процедуры установки достаточно указать местоположение JDK (среды времени исполнения и набора библиотек Java), и можно приступать к работе. Поддерживаются виртуальные машины, отличающиеся от эталонной JVM компании Sun (например, IBM).

Начало

Где начало того конца, которым оканчивается начало?
Козьма Прутков

Структурной единицей верхнего уровня в IDEA является проект. Проект состоит из одного или нескольких модулей, каждый из которых может иметь индивидуальные настройки. Число мастеров (wizards) сведено к минимуму с целью повышения прозрачности операций по созданию новых сущностей проекта. Среда имеет как логическое (рис. 2), так и физическое (рис. 3) дерево проекта, что придает ей определенное изящество в стиле WYSIWYG: результат выполнения любого действия над файлами проекта очевиден. Например, для создания нового класса и ассоциированного с ним java-файла можно вызвать операцию New… из контекстного меню того пакета, в который должен быть помещен класс.

В случае органического неприятия концепции проводника можно воспользоваться всплывающей панелью Commander — встроенным менеджером файлов IDEA, интерфейс которого напоминает интерфейс WinCommander. Вообще говоря, все в IDEA, кроме логического дерева проекта, редактора и главного меню, выполнено в виде всплывающих панелей, компактно расположенных по обоим краям и в нижней части окна. Панели сворачиваются и разворачиваются одним кликом.

Поддерживая возможность создания шаблонов классов, IDEA позволяет обзавестись набором параметризованных каркасов, соответствующих стандартным шаблонам проектирования (MVC, Singleton, Originator, Adapter и т. п.), и при необходимости использовать их в проекте, указывая при создании нового класса лишь параметры шаблона.

Почти все операции меню имеют синонимы в виде клавиатурных комбинаций. Комбинации легко настраиваются, причем существует несколько предопределенных стилей (MS Visual Studio 7, Borland JBuilder), рассчитанных на привычки мигрировавшего разработчика.

Намерения

Иногда удар не попадает в цель, но намерение не может промахнуться.
Жан-Жак Руссо

В принципе редактор исходного текста, встроенный в IDEA, ничего выдающегося собой не представляет. Различные виды подсветки для различных элементов языка, серый цвет для неиспользованных переменных и методов; три варианта автозаполнения кода (code completion); навигация всего и вся, — информативно, интерактивно и, как следствие, очень удобно. Например, для того, чтобы импортировать известный класс (директива import), достаточно ввести его название в любом месте кода. IDEA сама предложит выбрать пакет для импортирования, если класс ей известен (рис. 4).


Дифирамб же хочется пропеть инструменту, с которым в среде разработки я столкнулся впервые. Речь идет о так называемых намерениях (intentions). Смысл намерения заключается в том, что редактор, обнаруживая ошибку во введенной строке кода, не игнорирует факт ее появления простым подчеркиванием (типичное поведение большинства IDE, в том числе и Borland JBuilder), а ненавязчиво предлагает один или несколько путей решения проблемы. Воспользоваться предлагаемым вариантом или нет, решает разработчик, исходя из конкретной ситуации.

Например, необъявленная переменная будет отображаться красным цветом. Обратившись за разъяснениями к редактору (нажатием Alt+Enter или позиционированием курсора мыши на строке с ошибкой), обнаруживаем способы ее устранения (рис. 5, 6).

Всего таких намерений около девяноста, и они существенно повышают скорость работы. Также можно установить Intention Power Pack — расширение «от третьих лиц», содержащее еще пару десятков полезных намерений.

Дизайн

Все уже давно написано. По счастью, не обо всем еще подумано.
Станислав Ежи Лец

Долгие годы доминирования продукции от Borland на рынке IDE выработали определенный стандарт (далее — стандарт Borland) в отношении инструментов создания графического интерфейса пользователя. Стандарт Borland предусматривает окно дизайнера форм для размещения компонентов, настройки их свойств и обрабатываемых ими событий, а также синхронизацию исходного кода с операциями дизайна (автоматически генерируемый код). Минусы, связанные с использованием этой технологии в больших проектах, многочисленны и достаточно очевидны. Пожалуй, самый главный заключается в том, что почти все попытки хоть как-то переработать код, сгенерированный дизайнером форм (а в больших проектах именно эта операция бывает жизненно необходима), заканчиваются одинаково: дизайнер либо начинает глючить, либо напрочь отказывается работать.

Альтернативу данному подходу составляет технология привязки GUI (GUI form binding), реализованная в IDEA. Дизайнер форм IDEA предназначен для создания графических компонентов, задания их свойств и тестирования их поведения при изменении размеров окна; он оперирует файлом формы *.frm, не внося изменений в исходный код проекта. Для обработки событий, связанных с компонентом, необходимо связать файл формы с классом Java, а компонент GUI — с полем данного класса. Описанный подход устраняет практически все недостатки стандарта Borland, хотя и требует написания обработчиков событий компонента вручную. Для этой цели можно и нужно использовать намерения (На сайте компании JetBrains в разделе документации находятся анимационные swf-файлы, демонстрирующие методику создания GUI-форм в IDEA).

Способ размещения графических компонентов в контейнере, предлагаемый дизайнером IDEA, заслуживает отдельного упоминания. Человек, хотя бы раз писавший графические приложения на Java, хорошо знает, как утомительно размещать компоненты, используя стандартные менеджеры компонентов Swing, так, чтобы добиться корректного поведения компонентов при изменении размеров окна. И это при том, что потенциальное использование «проприетарных» менеджеров раскладки никак не влияет на чистоту концепции приложения в отношении кроссплатформности, Pure Java. Остается только удивляться чудесам прогресса (и портить нервы себе и окружающим), размещая компоненты в JBuilder: мало того что зачастую приходится «как в старые добрые времена» рисовать дизайн на бумаге, так еще и малейшие изменения требований к графическому интерфейсу могут повлечь за собой полную переделку GUI! А если к этому присовокупить порой катастрофическую задержку в процессе дизайна «от клика до отклика» (метко подмеченную в статье «Сыры-пыры», см. «КТ» #559), специфичную для JBuilder, особенно в его Linux-воплощении, то получается anti-pleasure какой-то.

Авторы IDEA предложили разработчикам свой менеджер раскладки компонентов, заимствовав его концепцию у дизайнера форм Qt — инструмента для создания кроссплатформных GUI-приложений на С++ (См. www.trolltech.com). Менеджер раскладки имеет всего пять примитивов (см. рис. 7): пружинку, задающую характер изменения размеров компонента; вертикальную и горизонтальную группировки, группировку в виде таблицы и, наконец, разгруппирование компонентов. Практика показывает, что это необходимый и достаточный набор примитивов для быстрого и качественного дизайна любой сложности с возможностью внесения изменений на лету. Сгруппированные компоненты образуют дерево, значительно облегчающее навигацию по труднодоступным компонентам.

Рефакторинг

В Лос-Анджелесе мусор уже не выбрасывают. Его перерабатывают в телевизионные шоу.
Вуди Аллен

Кроме успевших набить оскомину, но, тем не менее, очень полезных в хозяйстве операций рефакторинга — вроде переименования класса-поля-метода-переменной, выделения метода или изменения его сигнатуры, — в IDEA имеется еще более двадцати (sic!) операций по переработке исходного кода. Перечислять все виды рефакторинга нет смысла, поэтому ограничусь одним простым примером. В языке Java реализована модель одиночного наследования, и для того, чтобы один класс объединял в себе функциональность нескольких других (к примеру, одновременно являлся коллекцией листов и книгой), необходимо вместо наследования использовать делегирование. Заменить все соответствующие ссылки вручную — трудоемкая задача. А вот с помощью рефакторинга Replace Inheritance With Delegation она выполняется за считанные секунды.

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

Инспекция кода

Нет ничего настолько исправного, чтобы в нем не было ошибок.
Франческо Петрарка

Комплексный анализ качества исходного кода (Code Inspection) — очень мощный инструмент поддержки разработчика. Только вообразите: большинство недочетов и скрытых ошибок кода проекта, наличие которых, по существу, проводит грань между вами и высоким профессионалом, может быть локализовано и подано в виде, готовом к немедленному устранению. И вся эта операция занимает менее одной минуты для проекта средней сложности.

Принцип работы Code Inspection прост: он анализирует исходный код проекта на предмет наличия

  • устаревших (deprecated) методов API платформы Java;
  • нарушений спецификации компонентов (JavaBeans, EJB);
  • обилия вызовов методов другого класса (что свидетельствует о несбалансированности нагрузки между классами);
  • нарушений принципа инкапсуляции;
  • и еще около двухсот (опять же, sic!) потенциальных ошибок и недочетов.
  • Результаты анализа, выводящиеся в окно плавающей панели, хорошо структурированы и предоставляют возможность для удобной навигации по исходному коду. Что предпринять для исправления обнаруженных Code Inspection недочетов, решает сам разработчик. Разумеется, целесообразно выполнять рефакторинг везде, где это возможно.

    Интеграция

    Я готов и буду объединяться. И со всеми. Нельзя, извините за выражение, все время врастопырку.
    В. С. Черномырдин

    Платформа J2EE гетерогенна по своей природе: в ней есть средства и для построения веб-интерфейсов (сервлеты и Java Server Pages), и для управления бизнес-логикой корпоративных приложений (Enterprise Java Beans). Интеграцию с J2EE следует определить как степень удобства создания, отладки и развертывания различных J2EE-приложений.

    К чести JBuilder следует заметить, что потратив некоторое время на настройку сервера приложений и БД, можно быстро создавать и отлаживать приложения прямо в IDE. Трудности возникают, когда отлаживать и развертывать приложение нужно за пределами IDE, поскольку не всегда очевидно, что и где размещать. Например, один мой коллега по цеху долго не мог понять, почему для тестирования сервлетов вне JBuilder нужно скачать, установить и запустить Apache Tomcat. Проблема же в том, что хоть этот продукт и не входит в комплект поставки JBuilder, но «слишком тесно» с ним интегрирован. В IDEA имеется возможность создания J2EE-модулей, а также подключения их к установленному в системе серверу приложений. Сам по себе сервер приложений в состав поставки IDEA не входит. Удивительно, но в свете вышеописанных страданий молодого Вертера это тоже оказывается достоинством (правда, побочным). Единственное требование: сервер приложений должен соответствовать спецификации JSR45 — современному стандарту для серверов приложений Java. Выбрав и настроив сервер для J2EE-модуля, можно отлаживать и развертывать приложение непосредственно из среды разработки.

    Реализация взаимодействия с Ant (средством управления развертыванием приложений от Apache Group) выполнена в виде всплывающей панели Ant, к которой всегда можно добавить проект Ant путем указания xml-файла, описывающего проект. Присоединенный таким образом xml-файл идентифицируется IDEA как файл проекта Ant, что значительно упрощает создание новых задач, поскольку можно вызывать списки допустимых xml-сущностей, атрибутов и строковых значений (опять же, высший пилотаж) с помощью code completion.

    Остальное

    …кажется, что причин много, а как только называешь одну из них, так тут же и понимаешь, что это не та причина, или она не основная, или вообще…

    Евгений Гришковец.
    «Как я съел собаку»

    В дополнение к уже описанной программе содействия разработчику IDEA обладает также инструментом, отслеживающим использование разработчиком средств повышения производительности (например, различных намерений). Иными словами, если в процессе написания программы возникали ситуации, в которых можно было ускорить результат, а вы этим не воспользовались, IDEA зафиксирует факт подобного расточительства. Разработчик всегда может получить собственный «профиль неэффективности», сопровождающийся описанием того, как оптимизировать ту или иную ситуацию.

    Отметим, что IDEA 4.5, появившаяся на месяц раньше J2SE 5.0 Release Candidate, полностью соответствует значительно модернизированной платформе и включает в себя рефакторинг Generify… для автоматического преобразования объявлений объектов в их generic-эквивалент.

    Пожалуй, единственная ложка дегтя в бочке «pleasure» — это отсутствие встроенного средства прямого и обратного проектирования на UML (Возможно, дело в том, что автор статьи хочет иметь «всё и сразу». — Прим. ред.). Пока единственным продуктом такого рода, интегрированным с IDEA, является SDE (Smart Development Environment) — относительно дорогой UML-плагин для большинства известных сред разработки платформы Java. Работа с другими продуктами означает необходимость переключения между окном IDE и окном продукта, что вступает в конфликт с одной из главных концепций IDEA. Впрочем, для задач визуализации кода с помощью UML подойдет и бесплатный плагин SDE Community Edition — урезанная бесплатная версия SDE.

    Может сложиться впечатление, что IntelliJ IDEA рассматривается в статье как среда разработки, альтернативная JBuilder. Однако продолжительный опыт использования автором множества IDE для различных платформ и языков программирования позволяет уверенно заявить: IDEA — среда разработки будущего безотносительно языка программирования и платформы программирования (Стоит ли говорить, что мнение автора субъективно? — Прим. ред.).Во всяком случае, жизнь вашего покорного слуги, волей обстоятельств ставшего Java-разработчиком, с появлением IDEA сильно изменилась: производительность труда выросла, рутины изрядно поубавилось, в итоге появилось место для будущего. Думаю, оно будет тесно связано с новыми IDEA’ми.

    © ООО "Компьютерра-Онлайн", 1997-2022
    При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.