3

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

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

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

4

1 回答 1

5

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

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 的,但其余代码只使用 abstract DB

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

于 2014-08-13T09:04:29.593 回答