Mapping классов с помощью плагина в Android Studio

0a3b6bd82a042a32cef47853d22d74c0.png

Всем привет!
Лично меня всегда утомляла рутинная работа по созданию mapper-ов между дата классами. Особенно такого кода много, когда пишешь по Clean Artitecture. Разделяя слои. И на каждый слой создаётся куча сущностей. Очень часто в таких ситуациях эти классы просто дублируются.

И тогда я нашёл в библиотеку Mapstruct. Об этой библиотеке я написал тут.

В небольших проектах она оказалась очень подходящей. Особенно когда в проекте один человек, и это ты. В больших проектах добавление ещё одной kapt библиотеки значительно замедляет build проекта. А это значит, что такое решение не подходит.
Тогда мне пришла идея написать собственный плагин для подобных целей.

Так как плагины для Intellij IDea я никогда не писал, а время свободное у меня было то я решился.
Материалов на данную тему я особо не нашёл. Поэтому пришлось смотреть исходники уже существующих плагинов и учиться у них.

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

Что делает плагин

Работает плагин идеально, когда необходимо осуществить mapping одной сущности в другую при условии, если имена полей классов совпадают.

Также плагин отлично работает если классы содержат вложенные сущности. Если имена полей совпадают, то mapping произойдёт успешно. В случае несоответствия имени поля или его типа, будет подставленно значение null. Это означает что в данном случае можно подставить кастомную реализацию mapping-а.
Для новичков вот инструкция как установить плагин.
Открываем Android Studio, заходим во вкладку File, выбираем пункт Settings, выбираем пункт Plugins, в поле поиска вводим MapCraft, нажимаем кнопку Install. Возможно Android Studio предложит Restart IDE.

Как пользоваться плагином

Правой кнопкой мыши запускаем контекстное меню на классе источника данных (Source class). Выбираем в конце списка Generate Mapping.

Generate Mapping

Generate Mapping

В появившемся окне нажимаем ... и выбираем из всех классов проекта Target class.

Интерфейс диалогового окна

Интерфейс диалогового окна

Выбираем Target Class

Выбираем Target Class

Затем выбираем класс куда сгенерировать функцию, а также тип функции в виде Extension или Global function. Нажимаем кнопку Generate.
Получаем результат сгенерированной функции.

Результат

Результат

Планы. Что необходимо сделать

  1. Для сторонников ООП сгенерировать отдельный класс для каждого метода

  2. Групповой mapping

  3. Генерация функции без открытия файла с классом. Из списка файлов

Вывод

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

© Habrahabr.ru