【问题标题】:how to implement a repository of algorithms?如何实现算法存储库?
【发布时间】:2015-11-23 08:24:30
【问题描述】:

我有一组用 Java 实现并打包为 jar 文件的算法。这些算法旨在供第 3 方访问它们。算法有几种变体。加班,新版本和新类型的算法将被添加到。同时,我不会强迫所有第 3 方使用新算法。

我正在考虑为此实施一个简单的存储库系统。要求如下:

  1. 创建/删除存储库,以便每个存储库包含一组算法变体。
  2. 一个存储库中的算法可以同时运行 serverl 版本。
  3. 可以将新算法添加到存储库中。

是否有一些开源项目符合我的要求?或者有没有针对此类问题的设计模式?

【问题讨论】:

  • 搜索接口和工厂。 (有趣的是你应该提到design pattern。)
  • 我认为接口和工厂只是抽象了repo的外部行为,但我正在考虑repo内部机制的最佳实践。例如如何将不同版本的算法打包到 jar 中。如何存储它们,如何处理特定版本等
  • 对于一个给定的算法,每个版本是否在一个单独的类中实现(不同的完全限定名称)?
  • 我不想这样做,因为我不想将版本与类名结合起来。版本应仅在发布时确定。
  • 根据算法的抽象级别,您可以查看 API 提供的 service provider interface

标签: java design-patterns repository repository-design


【解决方案1】:

作为一个例子,Apache Commons Lang 通过在 2.0 和 3.0 版本之间更改它们的包名称来解决这个问题: org.apache.commons.lang 变成了org.apache.commons.lang3

来自What's new in Commons Lang 3.0?

我们已删除 API 中已弃用的部分,并且还删除了 一些被认为很弱或不必要的功能。这一切意味着 Lang 3.0 不向后兼容。

为此,我们更改了包名,允许 Lang 3.0 坐下 与您以前的 Lang 版本并排,没有任何不好的一面 效果。

【讨论】:

    【解决方案2】:

    如几个 cmets 中所建议的,基于模式的解决方案是声明接口并实现工厂:

    对于每种算法,您应该:

    • 声明它自己的接口,它应该以保守的方式及时存在:在新版本中,始终保留现有的 API 而无需修改(因此旧代码始终可以使用它)。如果需要,添加 方法。

    • 为您要支持的每个版本编写一个实现代码。此实现必须具有 package 可见性,并且它们可以共享同一个包,但每个包都有自己的名称。

    • 然后,添加一个工厂来构建实现对象。该工厂应将所需版本作为参数接收:

    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 {...}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2018-06-11
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      相关资源
      最近更新 更多