Fork me on GitHub
#clojure-russia
<
2018-12-29
>
kuzmin_m17:12:49

Разобрался я с валидацией. Все-таки спека это про форму данных, а не валидацию. И валидация может зависеть от разных внешних факторов. У меня вопрос поинтереснее:

{:publication/id 1
 :publication/translations {:en {:publication.translation/title "article"
                                 :article.translation/content "some content"}}
 :article/image-url "http://..."}
Т.е. я хочу расширить вложенную мапу, но не могу этого сделать, т.к. не могу переопределить :publication/translation и добавить туда :article.translation/content. Вариант решения я вижу только один - req-un. Может еще что-то есть?

dottedmag19:12:51

@kuzmin_m Это нельзя по определению. Если ты ссылаешься на :publication/translations, то она может быть только одного вида.

kuzmin_m19:12:23

так я ее расширяю

dottedmag19:12:28

Либо в :publication/translations сделать дополнительный ключ опциональный, и где-то его требовать.

dottedmag19:12:43

Так ты расширяешь свою спеку для внешнего типа, а не для внутреннего.

kuzmin_m19:12:52

по факту article наследует от publication т.е. он может усиливать контракт, что я и хочу если бы я ослаблял контракт, выкидывая ключи, это да

dottedmag19:12:09

Тогда просто сделай дополнительную проверку наверху.

kuzmin_m19:12:19

генератор отвалится 😃

kuzmin_m19:12:23

для датомика с его фактами спека идеально подходит а если нужны вложенные мапы - боль и страдания

dottedmag19:12:38

Спека плохо подходит для случая "а теперь мы напихаем всякую хрень в типы, на которые мы ссылаемся"

kuzmin_m19:12:00

можешь пояснить?

dottedmag19:12:22

Ну вот есть тип :publication/translations. Ты его определил, у него ключи, всё такое.

dottedmag19:12:34

А теперь оказывается, что тип-то не тот! В каком-то контексте там ещё другой тип.

kuzmin_m19:12:49

так я его расширяю

dottedmag19:12:57

Не его.

dottedmag19:12:57

Спека нерекурсивная.

dottedmag19:12:22

Можно расширить внутренний тип, а потом сослаться на расширенный в том месте, где надо.

kuzmin_m19:12:49

что значит “внутренний тип“?

dottedmag19:12:49

Но тогда нужно другой ключ, так как это другой тип.

dottedmag19:12:08

Тип мапы с ключом :publication/translations.

dottedmag19:12:37

Спека говорит "если ты употребил такой-то ключ, то этим ты сказал, что значение этого ключа имеет такой-то тип".

dottedmag19:12:53

И не подходит в случае, когда у одного и того же ключа разные типы.

kuzmin_m19:12:02

и приведения “типов” тут нет

kuzmin_m19:12:13

было бы забавно, если для доступа по ключу учитывалось наследование

(derive :b :a)
(:b {:a 1}) ;;=> 1
тогда можно было бы и спеки наследовать но это на первый взгляд наркомания

kuzmin_m19:12:21

вроде как дали “типы“, но они не работают как типы

dottedmag20:12:58

А это не типы, такие дела.

dottedmag20:12:04

Это формы.

kuzmin_m20:12:23

что такое “формы“?

dottedmag20:12:49

Data shapes. Спека подразумевает очень своеобразный подход к моделированию данных.

dottedmag20:12:08

Если ты что-то назвал, то у этого чего-то конкретная форма.

dottedmag20:12:23

Нельзя в двух разных местах использовать две разные формы под одним именем.

kuzmin_m20:12:24

ок, спасибо

dottedmag20:12:54

Я уже на это натыкался, когда хотел спекой покрыть чужую модель данных (там это вообще JSON).

dottedmag20:12:11

Там в зависимости от места в дереве один и тот же ключ означал разные вещи.

dottedmag20:12:17

Взял вместо этого схему.

👌 4
dottedmag20:12:19

Как раз вместе со schema-refined, на которую тут ссылка пробегала.

kuzmin_m20:12:02

Понял я свою ошибку. Нельзя так делать, как я хочу. Если у публикации есть публикация.перевод, и статья наследует публикации, то в интерфейсе статьи обязан быть публикация.перевод, а не статья.перевод.

kuzmin_m21:12:15

Нет, можно так делать: https://repl.it/@darkleaf/inheritance

razum2um21:12:57

https://hardcode.fm/2018/12/29/episode007.html теперь с @nicola Этот выпуск специально для этого чатика - про Рича, conj и maybe not (лучше поздно, чем никогда) Особенно тем, кто не в телеге 🙂

👍 16