如何在下面的fn中分离关注点

时间:2013-04-05 05:06:04

标签: clojure

以下功能可以做两件事 -

  • 检查atom是否为nil或fetch-agin为true,然后获取数据。
  • 它通过调用(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))

2 个答案:

答案 0 :(得分: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)))

顺便说一下,分离问题的模式被称为"功能" :)

答案 1 :(得分:2)

为了真正区分问题,我认为定义一个单独的提取和处理功能可能更好。所以他们决不会被收集。

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

请注意,我还将data atom作为参数。