我使用地图存储函数调用(在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
函数,或者此代码的结构不是惯用的?
答案 0 :(得分:1)
也许考虑将关键字视为函数。
((:transit parse-fn) data)
对我而言,更简洁的方法可以帮助我将第一个元素识别为不同。
或者,您可以将地图视为功能。
((parse-fn :transit) data)
据我了解,第一种方法通常被认为更具惯用性,也可以be optimized more intelligently。
答案 1 :(得分:1)
您的初始设计完全可读。将函数传递给执行实际工作的其他函数是一种非常正常的处理方式。我认为你不需要改变任何东西来“让它更具可读性”。如果我要更改任何内容以使我更加明确地将拼写的名称更改为transform-lookup或get-transform
(another-fn [... format ...] ... (transform-lookup format data))
或
(another-fn [... format ...] ... (get-transform format data))
虽然这是一个非常小的区别,它的方式很好。