Как реализовать репозиторий алгоритмов?

У меня есть набор алгоритмов, реализованных на Java и упакованных в виде jar-файлов. Алгоритмы предназначены для доступа третьих лиц к ним. Алгоритмы имеют несколько вариантов. Со временем будут добавлены новые версии и новые типы алгоритмов. В то же время я не хочу, чтобы все третьи стороны были вынуждены использовать новый алгоритм.

Я рассматриваю возможность внедрения простой системы репозитория для этого. Требования следующие:

  1. создавать / удалять репо, чтобы каждый репо содержал один набор вариаций алгоритма.
  2. алгоритмы в одном репозитории могут иметь одновременно запущенные версии serverl.
  3. новые алгоритмы могут быть добавлены в репо.

Какой-нибудь проект с открытым исходным кодом соответствует моим требованиям? Или есть какой-то шаблон дизайна для таких проблем?

2 ответа

Например, Apache Commons Lang решил эту проблему, изменив имя пакета между версиями 2.0 и 3.0:org.apache.commons.lang стал org.apache.commons.lang3,

Из Что нового в Commons Lang 3.0?

Мы удалили устаревшие части API, а также удалили некоторые функции, которые считались слабыми или ненужными. Все это означает, что Lang 3.0 не имеет обратной совместимости.

С этой целью мы изменили имя пакета, позволяя Lang 3.0 находиться рядом с вашей предыдущей версией Lang без каких-либо побочных эффектов.

Как было предложено в нескольких комментариях, решение, основанное на шаблонах, будет объявлять интерфейсы и реализовывать фабрики:

Для каждого алгоритма вы должны:

  • Объявите свой собственный интерфейс, который должен сохраняться во времени консервативным способом: во всех новых версиях всегда сохраняйте существующий API без изменений (чтобы старый код всегда мог его использовать). При необходимости добавьте новые методы.

  • Код реализации для каждой версии, которую вы хотите поддерживать. Эти реализации должны иметь видимость пакета, и они могут совместно использовать один и тот же пакет, но каждый из них имеет свое собственное имя corse.

  • Затем добавьте фабрику для создания объектов реализации. Эта фабрика должна получить в качестве параметра желаемую версию:

public class MyFactory { public MyInterface create(String version) throws VersionNotSupportedException {...} } Что касается кодирования этой фабрики, я также предлагаю вам добавить в каждый JAR META-INF/myfile с отображением между версиями и классами реализации, так что MyFactory мог получить их всех, выполняя:

getClass().getClassLoader().getResources("META-INF/myfile");

Пойдя дальше, вы можете объявить универсальную фабрику, параметризующую тип возвращаемых объектов:

public class MyGenericFactory<T>
{
    public T create(String version) throws VersionNotSupportedException {...}
}
Другие вопросы по тегам