0

以下の関数は2つのことを行います-

  • アトムが nil か fetch-agin が true かどうかをチェックしてから、データをフェッチします。
  • (add-date-strings) を呼び出してデータを処理します。

上記の2つの懸念を分離するためのより良いパターンは何ですか?

(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

考えられるリファクタリングの 1 つは次のとおりです。

(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

懸念事項を本当に分離するには、個別のフェッチ関数とプロセス関数を定義する方がよいと思います。決してそれらが完成していないように。

(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 に答える