我想创建多态模式/类型,并且对最佳实践感到好奇。以下 2 个示例允许我创建一个Frequency
可以重复事件的模式monthly by day of month
,或者monthly by day of week
(例如,分别每 15 日或每个第一个星期一)。
第一个使用实验性抽象图来实现这一点,它的语法很笨拙(IMO)。另外,在实验包中我有点担心。
第二个使用s/conditional
,它的缺点是无法轻松地强制type
从 astring
到的值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}}}))
不太有帮助的类似问题: