Clojure中的多态模式

时间:2016-05-15 14:15:00

标签: clojure schema plumatic-schema

我想创建多态模式/类型,并且我对最佳实践感到好奇。以下2个示例允许我创建Frequency模式,该模式可以重复事件monthly by day of monthmonthly by day of week(例如,每隔15日或每个第一个星期一)。

第一个使用实验抽象地图来实现这一点,它的语法很笨拙(IMO)。再加上实验包中有点担心我。

第二个使用s/conditional,这会导致无法轻易将type的值从string强制转换为keyword,这在处理时非常有用使用REST API或JSON。 (而s/eq对此非常有用)。

在一般情况下,其中一个或第三个选项是传达的最佳做法:Type A is one of Types #{B C D ...}

两个选项:

;;OPTION 1
​
(s/defschema Frequency (field (abstract-map/abstract-map-schema
                               :type {})
                              {}))
(abstract-map/extend-schema MonthlyByDOM Frequency
                            [:monthly-by-dom]
                            {:days #{MonthDay}})
(abstract-map/extend-schema MonthlyByDOW Frequency
                            [:monthly-by-dow]
                            {:days  #{WeekDay}
                             :weeks #{(s/enum 1 2 3 4 5)}})

;;OPTION 2
​
(s/defschema MonthlyByDOM "monthly by day of month, eg every 13th and 21st day" {:type (s/eq :monthly-by-dom)
                                                                                 :days #{MonthDay}})
(s/defschema MonthlyByDOW "monthly by day of week, eg first, and third friday" {:type  (s/eq :monthly-by-dow)
                                                                                :days  #{WeekDay}
                                                                                :weeks #{(s/enum 1 2 3 4 5)}})
(s/defschema Frequency (field (s/conditional #(= (s/eq :monthly-by-dom) (do (prn %) (:type %))) MonthlyByDOM
                                             #(= :monthly-by-dow (:type %)) MonthlyByDOW)
                              {:default {:type :monthly-by-dom
                                         :days #{1 11 21}}}))

类似的问题不太有帮助:

0 个答案:

没有答案