Всем привет!
Лично меня всегда утомляла рутинная работа по созданию 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.

Generate Mapping
Generate Mapping

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

Интерфейс диалогового окна
Интерфейс диалогового окна
Выбираем Target Class
Выбираем Target Class

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

Результат
Результат

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

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

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

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

Вывод

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

Комментарии (1)


  1. clint_eastwood Автор
    28.12.2024 08:04

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