Clojure spec - наименование ключевых слов сущности - PullRequest
0 голосов
/ 13 ноября 2018

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

Как прокомментировал @ 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)
...