Clojure规范-命名实体关键字

时间:2018-11-13 10:58:10

标签: clojure clojure.spec

使用不带名称空间的名称空间限定关键字来定义规范是否被认为是不好的做法?我想在通用的 domain 命名空间中定义实体映射...为了避免在合并规格时丢失数据,我使用了约定:entity/attribute而不是::entity-attribute属性和实体的标准::entity。它与数据库表和列更好地对齐。单独的命名空间中的每个实体使我想起Java类,听起来并不好。

(s/def :country/id   ::nilable-nat-int)
(s/def :country/name ::non-empty-string)

(s/def ::country
  (s/keys :req [:country/id
                :country/name]))

;; ----------------------------------------

(s/def :location/id      ::nilable-nat-int)
(s/def :location/name    ::non-empty-string)
(s/def :location/zipcode ::nilable-non-empty-string)

(s/def ::location
  (s/merge
   (s/keys :req [:location/id
                 :location/name
                 :location/zipcode])
   (s/or :country ::country
         :country-id
         (s/keys :req [:country/id]))))

1 个答案:

答案 0 :(得分:0)

正如@glts所评论的那样,这是正确的答案:mailing list

我决定使关键字更具体,将其添加到域名称空间:

(doseq [ns ["entity-1" ,,, "entity-n"]]
  (->> (str "project.domain." ns)
       (symbol)
       (create-ns)
       (alias (symbol ns))))

然后::entity-n/attribute的值为:project.domain.entity-n/attribute

问题示例中的属性仅需要一个附加的:

(s/def ::location/id ::nilable-nat-int)