我想知道在 Clojure 中实现数据封装的惯用方法是什么。下面我描述了我的特定用例来激发我提供的示例代码。
我在dbaccess 模块中有代码,它执行复杂的数据库查询以从数据库中获取一些数据。我还有许多对返回的原始数据进行操作的函数。然后,这些函数提供更多处理、更精细的数据视图,并使用来自系统中其他模块的不同参数多次调用。我们称它们为“ API 函数”。
查询很繁重,应该在开始时只执行一次,然后API 函数将对内存中的原始数据进行操作,而无需执行另一个 DB 查询。
这是我使用闭包的方法:
数据库访问模块
(ns dbaccess)
(let
[raw-data (complex-database-query)]
(defn create-client-names []
(fn [some-args] raw-data))
(defn create-client-portfolio []
(fn [some-args] raw-data))
(defn create-client-stocks []
(fn [some-args] raw-data)))
其他一些客户端模块
(def client-names (create-client-names))
(doall (map println (client-names "Baltimore")))
我不喜欢必须命名已捕获原始数据的已创建函数。
更重要的是,上面的代码不允许客户端模块在执行之前配置查询的各个方面(例如数据库连接信息)。
另一方面,如果不使用闭包,我将不得不在dbaccess 模块和其他需要调用API 函数的模块之间显式地来回传递原始数据。有没有更好的办法?我应该在dbaccess 模块中使用可变状态吗?