Лучшая практика для обнаружения изменений функций в программах на Scala?

Я работаю над языком сценариев на основе Scala (внутренний DSL), который позволяет пользователям определять несколько функций преобразования данных в файле сценария Scala. Поскольку применение этих функций может занять несколько часов, я хотел бы кэшировать результаты в базе данных. Пользователям разрешено изменять определение функций преобразования, а также добавлять новые функции. Однако, если пользователь перезапускает приложение с немного измененным сценарием, я бы хотел, чтобы выполнялись только те функции, которые были изменены или добавлены. Вопрос в том, как обнаружить эти изменения? Для простоты предположим, что пользователь может только адаптировать файл скрипта так, что любая ссылка на что-то, не определенное в этом скрипте, может считаться неизменной.

В этом случае какова наилучшая практика обнаружения изменений в таких пользовательских функциях?

До сих пор я думал о следующем:

  • разбор файла скрипта и вычисление отпечатков пальцев на основе исходного кода определений функций
  • получение байткода каждой функции во время выполнения и построение отпечатков пальцев на основе этих данных
  • применение функций к некоторым тестовым данным и вычисление отпечатков пальцев по результатам

Однако все три подхода имеют свои подводные камни.

  • Написание парсера для Scala для извлечения определений функций может оказаться довольно трудоемкой задачей, особенно если вы хотите обнаружить изменения, которые косвенно влияют на поведение ваших функций (например, если ваша функция вызывает другую (измененную) функцию, определенную в сценарии).
  • Анализ байткода может быть другим вариантом, но я никогда не работал с этими библиотеками. Поэтому я понятия не имею, могут ли они решить мою проблему и как они справляются с динамическим связыванием Java.
  • Подход с данными примера, безусловно, самый простой, но имеет недостаток в том, что различные пользовательские функции могут быть случайно сопоставлены с одним и тем же отпечатком пальца, если они возвращают одинаковые результаты для моих тестовых данных.

Кто-нибудь имеет опыт работы с одним из этих "решений" или может предложить мне лучшее?

11
задан Stefan Endrullis 23 September 2011 в 15:05
поделиться