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)
Другие вопросы по тегам