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)
使用命名空间限定的关键字和不存在的命名空间来定义规范是否被认为是不好的做法?我想在公共 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]))))
为
我决定使关键字更具体,将其添加到域名称空间中:
(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)