在很多情况下,我有一系列想要以不同方式实现的函数。最明显的例子是从特定的数据库中抽象出来。在面向对象的语言中,您可以使用一个接口来实现以下功能:
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。我应该为此使用多种方法吗?
发布于 2010-01-06 18:51:58
对于协议前的Clojure版本:
接口:
(ns dbbackend)
(defmulti query
{:arglists '([c q])}
suitable-dispatch-fn)
(defmulti persist!
{:arglists '([c o])}
suitable-dispatch-fn)实现:
(ns dbbackend.mysql
(:requires dbbackend))
(defmethod query com.mysql.jdbc.Connection
[c q]
...)
(defmethod persist! com.mysql.jdbc.Connection
[c o]
...)用法:
(ns user
(:require dbbackend dbbackend.mysql))
(def mysql-connection (connect-to-mysql))
(query mysql-connection some-query)您可以在ClojureQL的幕后找到此方法的真实示例。
https://stackoverflow.com/questions/2011439
复制相似问题