【问题标题】:ClojureScript - store functions in mapClojureScript - 在地图中存储函数
【发布时间】:2015-11-28 14:05:12
【问题描述】:

我正在使用映射来存储函数调用(在 ClojureScript 中,但在 Clojure 中应该相同):

(def parse-fn {:json    js/JSON.parse
               :edn     read-string
               :transit t->clj})

然后我有一个transform 函数,如下所示:

(defn transform [format data]
  ((get parse-fn format) data))

像这样调用transform(transform :transit data) 效果很好。我只担心transform 函数的可读性。第一件事是一个函数并不是很明显。

编辑:我不能只调用(:transit parse-fn),因为format 来自另一个函数,例如:(another-fn [... format ...] ... (transform format data))

是否有明确的call 函数,或者这段代码的结构不是惯用的?

【问题讨论】:

  • 我发现它实际上非常可读。 “给我获取传输的解析函数,然后用数据调用它”。 double (( 并不常见,所以读者实际上会在这里花点时间。
  • 考虑使用multimethods 来调度关键字而不是存储要调用的函数的地图。

标签: clojure clojurescript idioms


【解决方案1】:

您的初始设计是完全可读的。将函数传递给执行实际工作的其他函数是一种相当正常的做事方式。我认为您无需更改任何内容即可“使其更具可读性”。如果我要更改任何内容以使我更清楚地拼写出来,那就是将变换的名称更改为变换查找或获取变换

(another-fn [... format ...] ... (transform-lookup format data))

(another-fn [... format ...] ... (get-transform format data))

虽然这是一个很小的区别,但它的方式很好。

【讨论】:

    【解决方案2】:

    也许考虑把关键字当作函数。

    ((:transit parse-fn) data)
    

    对我来说,更简洁的方法有助于我将第一个元素识别为不同的。

    或者,您可以将地图视为函数。

    ((parse-fn :transit) data)
    

    据我了解,第一种方法通常被认为更惯用,也可以be optimized more intelligently

    【讨论】:

    • 抱歉我的问题不是很清楚,我会编辑一下。
    • 然后用格式替换transit?我可能误解了这里的意图。
    • 仍然不确定我是否理解,我认为问题出在可读性上?所以它就像(transform :transit data) 一样工作得很好。格式来自哪里无关紧要,只要它是一个符号,您应该可以像上面的方法一样使用它,就像(transform format data)?
    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多