0

下面的函数做了两件事——

  • 检查 atom 是否为 nil 或 fetch-agin 是否为真,然后获取数据。
  • 它通过调用 (add-date-strings) 来处理数据。

分离上述两个问题的更好模式是什么?

(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))
4

2 回答 2

2

一种可能的重构是:

(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)))

顺便说一句,分离关注点的模式称为“函数”:)

于 2013-04-05T05:43:51.920 回答
2

为了真正分离关注点,我认为定义一个单独的 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))

请注意,我还给出了数据原子作为参数。

于 2013-04-05T10:03:03.257 回答