gpt4 book ai didi

clojure - 使用闭包进行数据封装

转载 作者:行者123 更新时间:2023-12-02 11:08:10 25 4
gpt4 key购买 nike

我想知道实现数据封装的惯用方法是什么在 Clojure 中。下面我描述了我的特定用例来激发该示例我提供的代码。

我在 dbaccess 模块 中有代码,它执行复杂的操作数据库查询来获取一些来自数据库的数据。我还有很多功能可以操作关于返回的原始数据。这些功能然后提供更多经过处理、精炼的数据 View 并被多次调用不同论点的时代系统中的其他模块。我们将它们称为“API 函数”。

查询很繁重,应该在开始时只执行一次,然后API函数将对原始数据进行操作从内存中读取,而无需执行另一个数据库查询。

这是我使用闭包的方法:

数据库访问模块

(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 模块中使用可变状态?

最佳答案

I will have to explicitly pass the raw-data back and forth between the dbaccess module and the other modules that need to invoke API functions

您应该这样做,明确传递函数所需的数据,因为:

  • 这将导致数据创建方式和处理方式之间的松散耦合。
  • 阅读过程中函数会更清晰易懂。
  • 单个函数的测试将很容易,因为您可以轻松模拟数据。

关于clojure - 使用闭包进行数据封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15573378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com