Статьи

Walkmod: автоматически рефакторинг кода для применения соглашений о коде

Я очень заинтересован в инструментах, которые поддерживают процесс разработки программного обеспечения, делая автоматические скучные биты. Walkmod — это система, которая позволяет двигаться в этом направлении: умный инструмент, который может реорганизовывать проекты Java и обеспечивать соблюдение соглашений о коде. Это довольно мощный инструмент, и он должен привлекать все больше и больше внимания.

TL; DR: Такие инструменты, как Sonar, находят проблемы в вашем коде, Walkmod устраняет их за вас

У меня была возможность связаться с ведущим разработчиком, Ракель Пау, потому что мы оба являемся участниками JavaParser . Я не удержался, поэтому начал задавать ей много вопросов о проекте и подумал, что было бы неплохо поделиться ее ответами. Итак, вот они.

В конце этого поста также приведен пример применения walkmod на JavaParser для удаления неиспользуемых импортов.

Привет Ракель, можешь рассказать нам что-нибудь о себе и своих интересах?

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

Можете ли вы сказать нам, какую проблему пытается решить Walkmod?

Исправьте код автоматически в соответствии с набором кодовых соглашений.

Как вы думаете, в каких сценариях имеет смысл использовать Walkmod? Подходит ли это только для крупных проектов, или небольшие проекты могут извлечь из этого пользу?

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

Здесь есть несколько интересных историй об усыновлении:

  • MetricStream, всемирная распространяющая компания, использует Walkmod в течение последних 10 месяцев и создала собственные плагины для WalkMod для автоматического рефакторинга кода. В основном они были заинтересованы в автоматическом исправлении ряда проблем с сонаром и с помощью Walkmod смогли исправить тысячи строк кода. Прямо сейчас они работают над тем, чтобы опубликовать свои плагины на GitHub. Являясь частью MetricStream, WhileWorks также использует некоторые библиотеки Walkmod в одном из своих проектов с открытым исходным кодом, что также способствует повышению качества нашего инструмента.
  • С другой стороны, есть консалтинговые компании. Они находятся в интересном положении, потому что работают на одной базе кода со своими клиентами. Мне известно о некоторых из них, которые также использовали Walkmod (я не уверен, что могу назвать их имена ). В одном случае они также разработали плагины для интеграции Walkmod с другими инструментами (например, Gradle).
  • Java-проекты с открытым исходным кодом, такие как JUnit, Guava, Arquilian и Apache, могут получить особую выгоду от Walkmod, потому что в них вовлечено много разработчиков, и они постоянно меняются. На самом деле, даже если в некоторых документах указаны условные обозначения, ими сложно управлять и проверять. Однако я узнал от них, что применение условных обозначений кода во всем проекте (например, применение форматера Eclipse в соответствии с их собственными правилами) в одном коммите подразумевает слишком много кода для анализа и, следовательно, риск. Поэтому они отвергают такие коммиты. Фактически, это основная причина, по которой текущая версия walkmod позволяет:
    • Применять условные обозначения кода для набора файлов.
    • Применение набора условных обозначений кода без перезаписи всего исходного файла в соответствии с набором условных обозначений кода.

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

Как Walkmod сравнить с существующими решениями?

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

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

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

Насколько легко настраивать и разрабатывать новые преобразования? Я использовал M2M языки, такие как QVT, и они были болезненными

У меня был опыт проектирования преобразований модель-модель и модель-текст (например, с использованием ATL). Учитывая этот опыт, я решил не связывать Walkmod с каким-либо конкретным языком преобразования. Я думаю, что если мы ожидаем, что люди внесут свой вклад в создание соглашений кода посредством преобразований кода, Walkmod не должен требовать изучения какого-либо дополнительного языка. Поэтому я разработал 3 способа проектирования преобразования кода:

  1. Использование шаблона «Посетитель»: где людям просто нужно добавить функцию с названием « визит» для элемента типа, который они хотят изменить. После этого разработчики должны загрузить своего посетителя в виде библиотеки Java в репозиторий Maven.
  2. Использование шаблонов: многие Java-разработчики имеют опыт работы с технологиями шаблонов, такими как JSP, Velocity, Freemaker или Groovy. Мы выбрали систему шаблонов Grovy (GStringTemplateEngine) в качестве технологии шаблонов по умолчанию для Walkmod.
  3. Использование сценариев: Groovy — это язык сценариев, предпочитаемый разработчиками Java, и его легко интегрировать с Maven.

Кто должен развивать преобразования? Должны ли они быть архитекторами программного обеспечения или разработчики должны это делать?

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

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

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

Как Walkmod интегрируется с другими инструментами? Это обычно используется с инструментами CI, такими как Jenkins или Travis?

Walkmod может быть интегрирован в Forge, Eclipse, Maven или Gradle, и он был разработан для локального исполнения. Если разработчики добавят Walkmod в качестве плагина Maven или Gradle и запустят его из инструмента непрерывной интеграции, они могут просто получить уведомление, если некоторые исходные файлы не соответствуют их соглашениям.

Сохраняют ли преобразования пробелы? Сохраняют ли они комментарии?

В настоящее время Walkmod позволяет применять изменения в коде несколькими способами: используя форматировщик Eclipse или применяя только минимальные изменения, сделанные преобразованием. Во втором сценарии преобразования предотвращают пробелы.

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

Основаны ли преобразования только на AST или они знают о разрешении символов? Могу ли я определить правила типа «все классы расширяют этот базовый класс должен иметь конструктор по умолчанию?»

Преобразования учитывают разрешение символов, если у класса посетителя есть аннотация @RequiresSemanticAnalysis. Следовательно, когда выполняется преобразование кода, все типы объявлений и выражения имеют элемент отражения, на который ссылается узел ( java.reflect.Class, java.reflect.Method, java.reflect.Field и т . Д. ).

Насколько сложно будет использовать Walkmod для других языков, таких как Python или Ruby?

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

Walkmod — это инструмент с открытым исходным кодом, можете ли вы рассказать нам что-нибудь о сообществе? Какие у вас пользователи? Какие отзывы вы получаете?

Walkmod был анонсирован в 2014 году, и с этого момента в нашем сообществе участвуют MetricStream, ThoughtWorks и разработчики, которые работают в консалтинговых службах.

Как сообщество может помочь Walkmod? Вам нужно больше плагинов, помощь в разработке, больше документации или больше историй успеха о WalkMod?

В основном, я бы хотел, чтобы сообщество внесло свой вклад, написав плагины для Walkmod и поделившись своими отзывами.

Каковы планы на будущее Walkmod?

Наши планы — улучшить стиль конфигурации, чтобы было проще писать и создавать новые плагины. Более того, мы работаем над созданием сервиса вокруг инструмента.

Каков ваш опыт работы с открытым исходным кодом? Были негативные или позитивные сюрпризы?

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

Так что, надеюсь, этого будет достаточно, чтобы убедить вас начать пользоваться Walkmod: следующий шаг — это посетить www.walkmod.com и попробовать!

Пример: использование walkmod в исходном коде JavaParser для удаления неиспользуемых импортов

Хорошо, мы описали, как классный walkmod, перечислили множество функций и т. Д. И т. Д. Давайте, как это работает на практике.

Я первым делом скачал walkmod с их сайта (текущая версия 1.2.0, доступна здесь ). Я распаковал его и установил несколько переменных окружения:

1
2
3
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre
export WALKMOD_HOME=/home/federico/tmp/walkmod-1.2.0
export PATH=$PATH:$WALKMOD_HOME/bin

Затем я настроил walkmod для выполнения одной операции: удалить бесполезный импорт. Я только что создал имя файла walkmod.xml в корне проекта:

01
02
03
04
05
06
07
08
09
10
11
<!DOCTYPE walkmod PUBLIC "-//WALKMOD//DTD" "http://www.walkmod.com/dtd/walkmod-1.0.dtd" >
<walkmod>
<plugins>
<plugin groupId="org.walkmod" artifactId="walkmod-imports-cleaner-plugin" version="2.0" />
</plugins>
<chain name="example-chain" >
<reader path="/home/federico/repos/javaparser/javaparser-core/src/main/java" />
<transformation type="walkmod:commons:import-cleaner" />
<writer path="/home/federico/repos/javaparser/javaparser-core/src/main/java"/>
</chain>
</walkmod>

На этом этапе все, что мне нужно было сделать, это запустить walkmod apply из корня проекта:

walkmod

Потребовалось некоторое время, чтобы получить некоторые зависимости, но затем он прошел, хотя исходный код проекта довольно быстро, и нашел три файла для исправления. Как естественный рефлекс я выполнил тесты, и они все прошли: исправления, сделанные с помощью walkmod, верны. Затем я проверил измененные файлы и заметил, что walkmod переформатировал их, сохранив все комментарии (хорошо), но с использованием отступа в три пробела, который меня поразил.

К счастью, очень легко настроить поведение форматера: откройте walkmod-1.2.0 / config / formatter.xml и просмотрите свойства, чтобы понять, что вам нужно изменить. Например, меня не порадовали размер таблицы и размер отступа (эти два свойства имеют значение 3 на скриншотах ниже):

Скриншот-от-2015-08-25-162651

Скриншот-от-2015-08-25-162430

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

Затем я вспомнил, что JavaParser имеет свою собственную конфигурацию форматирования для Eclipse, и Walkmod использует тот же формат, поэтому я просто указал путь к этому файлу в конфигурации. Я отменил свои изменения в исходном коде (чтобы импорт дубликатов вернулся) и снова запустил Walkmod: я получил правильные файлы и хорошее форматирование.

И история закончилась новым Pull-запросом, отправляемым JavaParser:

Скриншот-от-2015-08-25-163843

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

В последние несколько дней они также запустили walkmodhub: это сервис, который вы можете использовать в качестве webhook для GitHub. Каждый раз, когда вы помещаете некоторый код в свой репозиторий, walkmod запускается и отправляет вам Pull-запрос, если есть нарушения ваших правил кодирования. Я думаю, что я буду любить это.