Автоматический рефакторинг зависимого кода после факта
Есть ли способ записать или описать рефакторинг Java таким образом, чтобы он мог автоматически применяться к зависимой базе кода?
Моя компания работает с двумя отдельными базами кода Java, платформой и надстройкой в зависимости от платформы. (Фактически, несколько надстроек для разных клиентов.) Платформа и надстройка разрабатываются разными командами, работающими над разными циклами выпуска: надстройка обновляется через некоторое время после выпуска платформы. Рефакторинг, примененный к платформе, не применяется автоматически к надстройке, потому что команда платформы даже не смотрит на код надстройки. Команда надстроек использует ранее выпущенный код платформы в режиме только для чтения и в настоящее время должна повторно применить рефакторинг платформы вручную (например, переименование классов и методов).
Интересно, может ли и как команда надстроек автоматически применить рефакторинг платформы к надстройке, вместо того, чтобы переходить от ошибки компиляции к ошибке компиляции после обновления платформы.
В настоящее время Eclipse используется обеими командами как IDE, но его использование смещается в сторону IntelliJ Idea.
1 ответ
Да, есть. То, что вы хотите, это система трансформации программ (PTS).
Хороший PTS позволяет вам определять явные преобразования в исходном коде как своего рода "метапрограмму", которая, если выполняется, достигает желаемого эффекта. Например, вы можете использовать следующее преобразование DMS (моя система, см. Био) для вставки вызовов журналирования в каждое взаимодействие с базой данных:
default domain Java~v7;
rule insert_db_log_call(i: identifier, m: modifiers, b: body, p: parameters): method->method =
" \m \i(\p) { \b } " -> " \m \i(\p) { log(\tostring\(\i\)); { \b } } "
if is_db_method_call(i).
Если вы тщательно определили такую метапрограмму, и она правильно работает на вашей первой кодовой базе, она должна иметь такой же эффект на второй базе. Может потребоваться некоторое усилие, чтобы выразить то, что вы действительно хотите сделать; Не все "рефакторинги" так легко описать, как "переименовать a в b".
Приведенный пример довольно прост; можно написать гораздо более сложные метапрограммы для достижения очень сложных эффектов.