【问题标题】:Managing dynamic dependencies in OCaml在 OCaml 中管理动态依赖项
【发布时间】:2014-10-06 08:31:49
【问题描述】:

想象一下 OCaml 中的一个库,它可能需要将其数据存储在某个地方。这个持久层可以用不同的库(sqlite、MySQL、PostgreSQL 等)来实现。并且根据存储的具体技术,它可能会提供不同的功能和性能保证。

有哪些方法可以管理此类库的外部依赖项?假设我使用 MySQL 进行开发,我不想在 sqlite 上引入编译时间和运行时依赖项。

在 C++ 中,我可能会使用抽象接口并将具体逻辑放入有条件地包含在我的项目中的模块中(取决于配置开关)。我很好奇,有人会如何在 OCaml 中处理相同的任务。

【问题讨论】:

    标签: ocaml opam


    【解决方案1】:

    您可能会定义一个模块类型来抽象所有实现。例如

    module type DB =
      sig
        type t
        type results
    
        val execute : t -> string -> results
        ...
      end
    

    然后您将编写代码以将此模块类型的实现作为参数:

     module MyProg (D : DB) = struct
       let run db =
         let r = D.execute db "SELECT ..." in
         ...
     end
    

    对于图书馆,这就是您所需要的。对于一个可执行程序,你需要一个单独的 main 函数来连接一些实际的数据库,这可能是特定于 DB 的,但其余代码只使用抽象 DB。

    (当然,您会使用比这种基于字符串的 API 更好的 API。这只是一个简单的示例。)

    【讨论】:

    • 如果你知道你永远不会在同一个程序中同时使用两个后端,那么你也可以定义一个由不同后端实现的通用接口,并在编译时链接正确的接口。优点是您不需要通过 DB 参数对整个代码库进行函数化。
    • 一流的模块也可能有助于避免整个程序的功能化
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2012-06-03
    • 2015-03-20
    • 2018-08-24
    相关资源
    最近更新 更多