Как реализовать репозиторий алгоритмов?
У меня есть набор алгоритмов, реализованных на Java и упакованных в виде jar-файлов. Алгоритмы предназначены для доступа третьих лиц к ним. Алгоритмы имеют несколько вариантов. Со временем будут добавлены новые версии и новые типы алгоритмов. В то же время я не хочу, чтобы все третьи стороны были вынуждены использовать новый алгоритм.
Я рассматриваю возможность внедрения простой системы репозитория для этого. Требования следующие:
- создавать / удалять репо, чтобы каждый репо содержал один набор вариаций алгоритма.
- алгоритмы в одном репозитории могут иметь одновременно запущенные версии serverl.
- новые алгоритмы могут быть добавлены в репо.
Какой-нибудь проект с открытым исходным кодом соответствует моим требованиям? Или есть какой-то шаблон дизайна для таких проблем?
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 {...}
}