Clojure 如何在以下fn中分离关注点
下面的函数做两件事-Clojure 如何在以下fn中分离关注点,clojure,Clojure,下面的函数做两件事- 检查atom是否为nil或fetch agin是否为true,然后获取数据 它通过调用(添加日期字符串)来处理数据 区分上述两个问题的更好模式是什么 (def retrieved-data (atom nil)) (defn fetch-it! [fetch-again?] (if (or fetch-again? (nil? @retrieved-data)) (->> (exec-services)
- 检查atom是否为nil或fetch agin是否为true,然后获取数据
- 它通过调用(添加日期字符串)来处理数据
(def retrieved-data (atom nil))
(defn fetch-it!
[fetch-again?]
(if (or fetch-again?
(nil? @retrieved-data))
(->> (exec-services)
(map #(add-date-strings (:time %)))
(reset! retrieved-data))
@retrieved-data))
一种可能的重构是:
(def retrieved-data (atom nil))
(defn fetch []
(->> (exec-services)
(map #(add-date-strings (:time %)))))
(defn fetch-it!
([]
(fetch-it! false))
([force]
(if (or force (nil? @retrieved-data))
(reset! retrieved-data (fetch))
@retrieved-data)))
顺便说一下,分离关注点的模式称为“函数”:)一种可能的重构是:
(def retrieved-data (atom nil))
(defn fetch []
(->> (exec-services)
(map #(add-date-strings (:time %)))))
(defn fetch-it!
([]
(fetch-it! false))
([force]
(if (or force (nil? @retrieved-data))
(reset! retrieved-data (fetch))
@retrieved-data)))
顺便说一下,分离关注点的模式称为“函数”:)要真正分离关注点,我认为最好定义一个单独的获取和处理函数。因此,它们绝不是完整的
(def retrieved-data (atom nil))
(defn fetcher []
(->> (exec-services)
(map #(add-date-strings (:time %)))))
(defn fetch-again? [force]
(fn [data] (or force (nil? data))))
(defn fetch-it! [fetch-fn data fetch-again?]
(when (fetch-again? @data))
(reset! data (fetch-fn))))
;;Usage
(fetch-it! fetcher retrieved-data (fetch-again? true))
注意,我还将数据原子作为参数 要真正分离关注点,我认为最好定义一个单独的fetch和process函数。因此,它们绝不是完整的
(def retrieved-data (atom nil))
(defn fetcher []
(->> (exec-services)
(map #(add-date-strings (:time %)))))
(defn fetch-again? [force]
(fn [data] (or force (nil? data))))
(defn fetch-it! [fetch-fn data fetch-again?]
(when (fetch-again? @data))
(reset! data (fetch-fn))))
;;Usage
(fetch-it! fetcher retrieved-data (fetch-again? true))
注意,我还将数据原子作为参数