В ряде случаев у меня есть набор функций, которые я хотел бы реализовать различными способами. Самый очевидный пример этого - абстрагироваться от конкретных баз данных. В объектно-ориентированном языке вы бы использовали интерфейс для этого:
interface DB {
ResultSet query(String query);
void persist(Object o);
...
}
В коде speudo я хотел бы сделать что-то вроде этого:
(ns dbbackend)
(abstractfn query [q])
(abstractfn persist! [o])
А затем реализации для каждой базы данных:
(ns dbbackend.mysql :implements dbbackend)
(defn query [q] ...)
(defn persist! [o] ...)
Мне не совсем понятно, что лучше всего делать что-то похожее на функциональном языке, особенно на Clojure. Должен ли я использовать несколько методов для этого?