Mapping классов с помощью плагина в Android Studio
Всем привет!
Лично меня всегда утомляла рутинная работа по созданию 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
В появившемся окне нажимаем ...
и выбираем из всех классов проекта Target class.
Интерфейс диалогового окна
Выбираем Target Class
Затем выбираем класс куда сгенерировать функцию, а также тип функции в виде Extension
или Global function
. Нажимаем кнопку Generate.
Получаем результат сгенерированной функции.
Результат
Планы. Что необходимо сделать
Для сторонников ООП сгенерировать отдельный класс для каждого метода
Групповой mapping
Генерация функции без открытия файла с классом. Из списка файлов
Вывод
В целом, результатом я доволен.
Так как в основном я занимаюсь Android разработкой, лично у меня возникли трудности в построении архитектуры приложение. Если у кого-то будут замечания или предложения — буду рад услышать конструктивную критику. Как и предложение по улучшению продукта.