Автоматический рефакторинг Monolith

У нас есть довольно большое монолитное программное обеспечение, которое мы хотели бы реорганизовать в большем масштабе. Первым шагом будет получение нескольких артефактов, которые можно скомпилировать независимо друг от друга. Учитывая размер приложения, мы хотели бы максимально автоматизировать его.

Пример:

+ package1
|    |
|    + Service1
|
+ package2
|    |
|    + Service2
|
+ interfacepackage

Предполагая, что Service1 используется только внутри package1, его не следует трогать. Предполагая, что Service2 используется из Service1, я хотел бы автоматически сгенерировать минимальный интерфейс для Service2, поместить этот интерфейс в пакет interfacepackage и изменить зависимость внутри Service1 на интерфейс.

Сделать это вручную не составит труда. И Idea, и Eclipse обеспечивают полуавтоматический рефакторинг, но мы хотели бы сформулировать их в виде метаправил. У меня были надежды, что либо eclipse, либо intellij имеют программный интерфейс для определения таких правил, но я пока не смог их найти.

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

Где мне искать решение?

Пояснение: Комментарий: Так в чем проблема?

У нас есть высокое трехзначное количество услуг, которые составляют этот монолит. Это в ок. 20 различных пакетов. Все программное обеспечение приближается к 1 миллиону строк кода. Моя проблема просто в размере. Выполнение рефакторинга вручную может занять месяцы, мы можем что-то упустить, делая это вручную. Кроме того, распутывание сервисов — это только первый шаг. Так что мы ожидаем много подобных рефакторингов, применяемых в будущем.


person Jonathan    schedule 19.08.2019    source источник
comment
Сделать это вручную не составит труда. Так в чем же проблема?   -  person Michael    schedule 19.08.2019
comment
Вы можете написать подключаемый модуль Eclipse, который вносит настраиваемые рефакторинг для этого.   -  person howlger    schedule 19.08.2019
comment
@howlger будет ли это автоматически применяться ко всему исходному дереву? Помните, что я не хочу индивидуально применять рефакторинг к одному классу, а хочу позволить системе идентифицировать все классы, подходящие для рефакторинга.   -  person Jonathan    schedule 19.08.2019
comment
@Jonathan Конечно, вы можете написать это, например. быть применимым к проекту или исходной папке.   -  person howlger    schedule 19.08.2019
comment
Похоже, вам нужно либо написать сценарий (использовать язык сценариев), либо написать плагин самостоятельно. Но, пожалуйста, имейте в виду - отправляясь в рай микросервисов, вы часто можете оказаться в аду микросервисов.... вам действительно нужно разделить монолит на более чем 100 сервисов? Как вы собираетесь управлять ими? А зависимости? А конвейеры сборки/выпуска/развертывания? Будет ли вам лучше в конце концов?   -  person vikingsteve    schedule 19.08.2019
comment
@vikingsteve мы не собираемся использовать микросервис. За неимением лучшего слова, мы идем на модульлит. Конечно, мы могли бы использовать сценарий, но этот сценарий потребуется для разбора кода Java. Я надеюсь получить доступ к метамодели, IDE уже создаются в фоновом режиме. Я попробую идею Howlger и выберу плагин для рефакторинга.   -  person Jonathan    schedule 19.08.2019


Ответы (1)


IntelliJ IDEA имеет «открытый API», который можно использовать для разработки плагинов.

Преимущество в том, что IntelliJ анализирует java-код, а «метамодель» доступна вам как автору плагина.

В IntelliJ модель «AST» относится к «Абстрактному синтаксическому дереву». Эта структура бесценна для плагинов, выполняющих рефакторинг.

Вы можете легко увидеть структуру пакета, имена классов, код и так далее.

https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started.html

Примечание! Функциональность Java для разработки плагинов была реализована в виде плагина.

https://blog.jetbrains.com/platform/2019/06/java-functionality-extracted-as-a-plugin/

Также обратите внимание на мои собственные плагины на github, где я разместил исходный код.

https://github.com/Steve-Murphy/unencapsulate-plugin

person vikingsteve    schedule 19.08.2019
comment
Спасибо за ваш вклад. Поскольку мы в основном используем IDEA в нашей компании, я бы предпочел это решение решению eclipse. Я вернусь сюда, как только у меня будет время заглянуть. - person Jonathan; 19.08.2019
comment
Разработка плагинов чрезвычайно эффективна и может спасти жизнь в подобных задачах. Удачи! - person vikingsteve; 19.08.2019
comment
Вы случайно не знаете, как получить доступ к реализации PSI для Java в IDEA? Они не включаются после настройки плагина, как описано в инструкции. Кроме того, jdt-плагин, похоже, использует eclipse-API для фактического синтаксического анализа. - person Jonathan; 20.08.2019
comment
Не бери в голову. Проблема здесь в том, что функциональность Java была экстернализирована в идее 2019.2: blog.jetbrains.com/platform/2019/06/. Пока документация не была обновлена... не могли бы вы обогатить свой ответ для дальнейшего использования? - person Jonathan; 20.08.2019