Поддержка «чистоты» кода с помощью Eclipse V3.3

Катрин Лимпек, Филипп Тидт

Написание "чистого" кода помогает другим разработчикам читать, понимать и сопровождать написанный вами код. Однако не все согласны с определениями "симпатичного", "правильного" или "чистого" кода. У каждого разработчика свой стиль и своё эстетическое чувство. До сих пор Eclipse форматировал импортированный код в простой, функциональной манере с минимальным количеством украшательств. В Eclipse V3.3 эти операции расширены, чтобы предоставить гораздо более широкий спектр возможностей для очистки кода. Eclipse V3.3 позволяет вам выполнять очистку кода, добавлять пропущенный код, а также применять определённый стиль кодирования. Мастер поможет сконфигурировать настройки очистки и сохранить их для дальнейшего использования.

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

Управление конфигурацией параметров очистки кода при помощи профилей

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

Параметры настройки Eclipse предлагают возможности управления профилями. Профили можно создавать, редактировать и удалять. Можно определить профиль, используемый глобально во всем рабочем пространстве. Когда мы в первый раз открываем параметры настройки рабочего пространства и выбираем Java > Code Style > Clean Up, то видим активный профиль Eclipse [built-in] (встроенный). Этот встроенный профиль предварительно настроен и поставляется в комплекте с Eclipse. Всего имеется два встроенных профиля: Eclipse и Save Participant. Они описывают две минимальные конфигурации очистки кода, которые, в сущности, удаляют ненужный код. Настройки встроенного профиля можно увидеть, сделав его действующим профилем. Все подробности отображаются в области детализации.

Рисунок 1. Подробная информация по встроенному профилю
Подробная информация по встроенному профилю

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

Чтобы создать собственный профиль, нажмём на New. Дадим профилю имя и выберем из выпадающего меню существующий профиль для инициализации. Снимем галочку с Open the edit dialog now (открыть диалог редактирования сейчас) и нажмём OK.

Рисунок 2. Новый профиль
Новый профиль

Чтобы профиль можно было использовать совместно, используем функцию экспорта. Чтобы открыть профиль, нажмём Edit, а затем Export. Дадим имя файлу профиля, нажмём OK, и профиль готов для совместного использования.

Рисунок 3. Экспорт профилей
Новый профиль

Чтобы применить внешний профиль из XML-файла к проекту, мы должны сначала его импортировать. Нажмём Import в основных параметрах очистки кода, выберем файл и нажмём OK.

Типы очистки кода

Настройки очистки кода делятся на пять основных категорий. Для каждой категории имеется своя вкладка, которая состоит из области настроек и области предварительного просмотра. Предварительный просмотр сразу же показывает влияние настроек на код. Попробуем разные настройки и посмотрим, как меняется код в предварительном просмотре. Это даст возможность понять, как каждое изменение влияет на код. Диалог для редактирования всех этих настроек появляется на экране после нажатия на Edit в настройке основных параметров очистки кода или при создании нового профиля с опцией Open the edit dialog now.

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

Вкладка Code Style (стиль кода)

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

Секция Control statements (управляющие операторы)
Выберите Use blocks in if, while, for, do statements (Использовать блоки в операторах if, while, for и do), чтобы определить, где использовать фигурные скобки. Фигурные скобки облегчают читаемость кода, визуально объединяя логически связанные элементы. Использование фигурных скобок также помогает избежать ошибок при добавлении нового оператора в условие оператора if или else. С другой стороны, слишком большое количество фигурных скобок увеличивает объём кода и делает его громоздким.

Выберите Convert for loops to enhanced (Преобразовывать циклы for в расширенные), чтобы использовать для циклов типа for нотацию, введённую в Java™ V5.0 для сокращения кода. Обратите внимание, что такое преобразование несовместимо с прежними версиями.

Секция Expressions (Выражения)
Выберите Use parentheses around conditions (Заключать условия в круглые скобки), чтобы определить, где нужно использовать круглые скобки. Приведённые выше комментарии, касающиеся фигурных скобок, верны и для круглых скобок.
Секция Variable declarations (Описания переменных)
Выберите Use modifier 'final' where possible (Где возможно - использовать модификатор 'final'), чтобы определить, где необходимо использовать ключевое слово final. Модификатор final не только описывает переменные, которые никогда не должны изменяться, но и служит отличным средством для принудительной установки закрытых полей. Модификатор final важен для производительности, для надёжной и корректной работы.

Рисунок 4. Стили кодирования
Стили кодирования

Вкладка Member Accesses (Доступ к элементам)

Вторая вкладка позволяет задать, как следует обращаться к элементам (member) ваших типов.

Секция Non static accesses (Нестатический доступ)
Выберите, где вы хотите использовать квалификатор this для обращения к полям или методам. Квалификатор this помогает быстро увидеть, какие поля или методы являются элементами класса, который вы в данный момент пишете. Это поможет вам отличать поля и локальные переменные, использующие одинаковые имена.
Секция Static accesses (Статический доступ)
С помощью флажков задайте настройки квалификации. Доступ к статическим элементам можно квалифицировать через описывающий класс, чтобы было легче определить, в каком типе описан данный элемент. С другой стороны, длинные имена классов могут сделать громоздкими простые обращения к элементам и сделать их на вид нечитаемыми, либо занимающими несколько строк кода.

Рисунок 5. Доступ к элементам
Доступ к элементам

Вкладка Unnecessary code (Ненужный код)

Третья вкладка позволяет задавать настройки для удаления неиспользуемого или ненужного кода.

Секция Unused code (Неиспользуемый код)
Первый флажок позволяет удалить неиспользуемые импорты. Если вы не используете Organize imports (организовать импорты) или ключевую комбинацию Strg+Shift+o, то автоматическое удаление неиспользуемых импортов поможет сохранить ваш проект максимально компактным и не содержащим неиспользуемых библиотек.

Установка второго флажка позволяет удалить неиспользуемые частные элементы (private members). К частным элементам можно обращаться только внутри содержащих их классов. Если же они не используются, значит, они и не нужны. Они лишь создают лишнюю нагрузку на компилятор. Их удаление может быть довольно эффективным после реструктуризации программы и выявления значительных фрагментов неиспользуемого кода. С другой стороны, это может быть весьма опасным. Представьте, что вы создаёте прототипы новых методов, которые пока ещё не используются, но могут использоваться в будущем. Если активировать опцию очистки неиспользуемого кода, они будут удалены, и сделанная работа будет потеряна.

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

Второй флажок позволяет избавиться от ненужных тегов $NON-NLS$. Эти теги используются Eclipse лишь для того, чтобы определить строки, которые не должны подвергаться экстернализации.

Рисунок 6. Ненужный код
Ненужный код

Вкладка Missing Code (Пропущенный код)

Четвёртая вкладка позволяет добавлять пропущенный код.

Секция Annotations (Комментарии)
Определите, какие комментарии надо добавлять к коду. Начиная с Java V5.0, комментарии типа @Override или @Deprecated помогают компилятору генерировать ошибки, когда используются запрещённые методы или когда метод с меткой override (переопределяющий) не в состоянии корректно переопределить метод в одном из суперклассов. Обратите внимание, что эти комментарии не совместимы с прежними версиями.
Секция Potential programming problems (Потенциальные проблемы программирования)
Задайте этот параметр, если вы хотите добавить серийные ID версий. В классах, реализующих интерфейс Serializable, мы рекомендуем иметь частную статическую конечную переменную для серийных версий UID. Это можно сгенерировать автоматически. Это используется для проверки совместимости во время десериализации.

Рисунок 7. Пропущенный код
Пропущенный код

Вкладка Code Organizing (Организация кода)

Последняя по порядку, но не по значимости, пятая вкладка помогает организовать код.

Секция Formatter (Форматер)
Воспользуйтесь ей, если в процессе очистки кода должен использоваться форматер. Проверьте параметры настройки форматера: Preferences > Java > Code Style > Formatter.
Секция Imports (Импорты)
Воспользуйтесь ей, если требуется использовать опцию Organize Imports (Организовывать импорты). Проверьте параметры настройки опции Organize Imports: Preferences > Java > Code Style > Organize Imports.
Секция Members (Элементы)
Воспользуйтесь ей, если хотите упорядочить элементы по алфавиту. Иногда для удобства ориентирования в программном коде хорошо, когда элементы организованы в алфавитном порядке. В свою очередь, против этого могут быть свои аргументы. Представьте, что вы так структурируете код, что методы, вызывающие друг друга, находятся рядом друг с другом для удобства ориентирования в коде. Алфавитная сортировка реорганизует их так, что они будут располагаться в неудобном порядке. Обзорное представление предлагает очень удобную функцию, позволяющую сортировать представление элементов, не изменяя их порядок в коде. Конкретные настройки и опции сортировки элементов можно найти в Preferences (параметры)> Java > Appearance (внешнее представление)> Members Sort Order (порядок сортировки элементов).

Рисунок 8. Организация кода
Организация кода

Как применять профили

После того, как профиль очистки кода создан, применить его к конкретному коду можно разными способами. Самый простой способ - открыть контекстное меню в редакторе Java и выбрать Source (источник)> Clean Up (очистить).

Рисунок 9. Открытие мастера очистки кода
Открытие мастера очистки кода

В результате будет запущен мастер очистки кода, изображенный ниже.

Рисунок 10. Мастер очистки кода
Мастер очистки кода

Мастер направляет вас в процессе очистки выбранных источников. Описание в верхнем левом углу показывает, сколько проектов и единиц компиляции будет очищено. Обычно к единицам компиляции применяют уже сконфигурированный профиль. Тем не менее, возможна индивидуальная настройка очистки кода непосредственно перед его применением. Это может быть полезным, если вы хотите проверить, как определённая настройка отразится на коде.

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

По умолчанию существует один глобальный профиль очистки кода для всей рабочей области. Однако в параметрах проекта можно указать профиль очистки кода для каждого отдельного проекта. Для этого откройте свойства проекта и перейдите к Java Code Style (стиль кода Java)> Clean Up (очистить), как показано ниже.

Рисунок 11. Применение профилей
Применение профилей

Чтобы выполнить предварительный просмотр результатов очистки кода, нажмите Next в мастере очистки кода. В этот момент мастер подсчитывает изменения в вашем коде. В зависимости от количества выбранных единиц компиляции этот процесс может занять определённое время. На следующей странице вам будут представлены изменения, которые планируется применить.

Рисунок 12. Предварительный просмотр результатов
Предварительный просмотр результатов

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

Полезные советы

Некоторые рефакторинговые операции очистки, например, Convert for loops to enhanced (преобразовать циклы for в расширенные) или Add missing annotations (добавить пропущенные комментарии), привязаны к версиям Java 5.0 или 6.0 и могут применяться, лишь если исходный файл скомпилирован в соответствии с требуемой версией Java. Мастер очистки кода позволяет выбрать эти рефакторинговые опции независимо от используемой версии Java. Поэтому, если вдруг ваши циклы типа for не конвертируются или запрещённые методы не аннотируются как положено, проверьте рабочую область или проект на соответствие определённому уровню компилятора в Preferences (параметры)> Java > Compiler (компилятор).

После нескольких запусков мастера очистки кода и правильной настройки вашего профиля, вы, возможно, не захотите при каждой последующей операции очистки снова щёлкать по кнопкам мастера. В этом случае можно просто отключить мастер на странице настройки профилей в Preferences > Java > Code Style > Clean Up.

Рисунок 13. Скрыть/показать мастер очистки кода
Скрыть/показать мастер очистки кода

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

Рисунок 14. Применение фильтров
Применение фильтров

Операции очистки кода могут выполняться не только вручную, но и во время сохранения файла Java. Чтобы включить эту функцию, откройте Window > Preferences > Java > Editor > Save Actions (действия при сохранении) и выберите дополнительные действия. Сконфигурируйте действия по очистке кода, как описано выше, и они будут выполняться при каждом сохранении файла Java. Обратите внимание, что эти действия могут оказаться ресурсоемкими и затормозить работу. Кроме того, если забыть о включенной опции очистки кода, вас может удивить, что только что написанный вами код после сохранения выглядит по-другому.

Рисунок 15. Выполнение очистки кода во время сохранения
Выполнение очистки кода во время сохранения

А теперь?

Очистка кода является полезным инструментом, улучшающим оформление вашего кода и помогающим другим разобраться в нём. Возможно, она даже сделает ваш код более устойчивым к ошибкам. Однако стиль кодирования - это дело вкуса. Например, люди, которые в прошлом избегали большого количества кавычек, вряд ли теперь будут использовать блоки каждый раз, когда мастер очистки кода будет предлагать это действие.

Очистка кода не решает концептуальных или функциональных проблем, по крайней мере, в текущей версии Eclipse. Но она может сэкономить большой объём работы, представляя код в понятном виде. Действия, выполняемые мастером, обширны и решают многие проблемы, связанные со стилями и соглашениями кодирования. Организации должны выбрать собственный стиль и соглашения для кодирования, поэтому полезно, чтобы мастер был расширяемым, хотя в Eclipse V3.3 это не так. Идея очистки кода актуальна не только в мире Java, но также могла бы быть полезна и для других языков, таких как C/C++, PHP, Python, Perl и т. д. Будет интересно посмотреть, как сообщество примет эту функцию и в каких направлениях она будет развиваться.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=9761