2013-04-05 43 views
0

分离关注下面的函数做两件事情 -如何在下面FN

  • 检查该原子是零或取回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)) 

回答

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

通过的方式,独立出来的担忧模式被称为“功能” :)

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

请注意,我还将数据原子作为参数。