
Всем привет!
Лично меня всегда утомляла рутинная работа по созданию mapper-ов между дата классами. Особенно такого кода много, когда пишешь по Clean Architecture. Разделяя слои. И на каждый слой создаётся куча сущностей. Очень часто в таких ситуациях эти классы просто дублируются.
И тогда я нашёл в библиотеку Mapstruct. Об этой библиотеке я написал тут.
В небольших проектах она оказалась очень подходящей. Особенно когда в проекте один человек, и это ты. В больших проектах добавление ещё одной kapt библиотеки значительно замедляет build проекта. А это значит, что такое решение не подходит.
Тогда мне пришла идея написать собственный плагин для подобных целей.
Так как плагины для Intellij Idea я никогда не писал, а время свободное у меня было, то я решился.
Материалов на данную тему я особо не нашёл. Поэтому пришлось смотреть исходники уже существующих плагинов и учиться у них.
Так как целью данной статьи не служит раскрытие темы как написать плагин для Android Studio, то я, с вашего позволения, просто раскрою смысл и результат моей работы.
С исходниками проекта вы можете ознакомиться тут.
Что делает плагин MapCraft
Работает плагин идеально, когда необходимо осуществить mapping одной сущности в другую при условии, если имена полей классов совпадают.
Также плагин отлично работает если классы содержат вложенные сущности. Если имена полей совпадают, то mapping произойдёт успешно. В случае несоответствия имени поля или его типа, будет подставленно значение null. Это означает что в данном случае можно подставить кастомную реализацию mapping-а поля.
Для новичков вот инструкция как установить плагин.
Открываем Android Studio, заходим во вкладку File, выбираем пункт Settings, выбираем пункт Plugins, в поле поиска вводим MapCraft, нажимаем кнопку Install. Возможно Android Studio предложит Restart IDE.
Как пользоваться плагином MapCraft
Правой кнопкой мыши запускаем контекстное меню на классе источника данных (Source class). Выбираем в конце списка Generate Mapping.

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


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

Планы. Что необходимо сделать
Для сторонников ООП сгенерировать отдельный класс для каждого метода
Групповой mapping
Генерация функции без открытия файла с классом. Из списка файлов
Вывод
В целом, результатом я доволен.
Так как в основном я занимаюсь Android разработкой, лично у меня возникли трудности в построении архитектуры приложение. Если у кого-то будут замечания или предложения - буду рад услышать конструктивную критику. Как и предложение по улучшению продукта.
clint_eastwood Автор
маппинги нужны не только в клин - да, но если пишешь по клину то и сущности должны быть не связанными между слоями. на каждый слой одтельные сущности, и как раз маппинг обеспечивает связи сежду слоями.