2013-04-05 49 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)) 

請注意,我還將數據原子作爲參數。