Clojure spec - наименование ключевых слов сущности
Считается ли плохой практикой использование ключевых слов с определенным пространством имен с несуществующими пространствами имен для определения спецификаций? Я хотел бы, чтобы карты сущностей определялись в общем пространстве имен домена... поэтому, чтобы избежать потери данных при объединении спецификаций, я использовал соглашение :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 ответ
Как прокомментировал @glts, вот правильный ответ: список рассылки.
Я решил сделать ключевые слова более конкретными, добавил это в пространство имен домена:
(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)