Clojure 规范 - 命名实体关键字

Clojure spec - naming entity keywords

使用命名空间限定的关键字和不存在的命名空间来定义规范是否被认为是不好的做法?我想在公共 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]))))

commented, here is the right answer: 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)