2014-08-13 4 views
3

Представьте себе библиотеку в OCaml, которая может потребоваться для хранения своих данных. Этот уровень персистентности можно реализовать с помощью разных библиотек (sqlite, MySQL, PostgreSQL и т. Д.). И в зависимости от конкретной технологии хранения, он может предложить различные функции и гарантии производительности.Управление динамическими зависимостями в OCaml

Каковы возможные способы управления внешними зависимостями для такой библиотеки? Скажем, если я буду развиваться с MySQL, я не хочу вводить ни времени компиляции, ни времени выполнения для sqlite.

В C++ я мог бы использовать абстрактные интерфейсы и поместить конкретную логику в модули, условно включенные в мой проект (в зависимости от переключателей конфигурации). Мне любопытно, как кто-то подходил к одной и той же задаче в OCaml.

ответ

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 

для библиотеки, это все, что вам нужно. Для исполняемой программы вам потребуется отдельная основная функция для подключения к какой-либо реальной базе данных, которая может быть специфичной для БД, но в остальной части кода используется только абстрактное DB.

(Конечно, вы бы использовать более API, чем это строки на основе одного. Это лишь простой пример.)

+3

Если вы знаете, что вы никогда не будете использовать два движки одновременно в одной и той же программы, то вы можете также определяют общий интерфейс, реализованный разными бэкендами, и связывают правый во время компиляции. Преимущество состоит в том, что вам не нужно функторизировать всю вашу базу кода по аргументу DB. –

+1

первоклассные модули также могут помочь избежать функторизации всей программы – ygrek

 Смежные вопросы

  • Нет связанных вопросов^_^