clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
kuzmin_m 2018-12-29T17:51:49.072600Z

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

{: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. Может еще что-то есть?

dottedmag 2018-12-29T19:48:51.073500Z

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

kuzmin_m 2018-12-29T19:49:23.074500Z

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

dottedmag 2018-12-29T19:49:28.074700Z

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

dottedmag 2018-12-29T19:49:43.075600Z

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

kuzmin_m 2018-12-29T19:50:52.077800Z

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

dottedmag 2018-12-29T19:51:09.078200Z

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

kuzmin_m 2018-12-29T19:51:19.078400Z

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

dottedmag 2018-12-29T19:51:52.078600Z

¯\(ツ)

kuzmin_m 2018-12-29T19:52:23.079300Z

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

dottedmag 2018-12-29T19:52:38.079800Z

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

kuzmin_m 2018-12-29T19:53:00.080100Z

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

dottedmag 2018-12-29T19:53:22.080600Z

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

dottedmag 2018-12-29T19:53:34.081Z

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

kuzmin_m 2018-12-29T19:53:49.081700Z

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

dottedmag 2018-12-29T19:53:57.081900Z

Не его.

dottedmag 2018-12-29T19:53:57.082100Z

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

dottedmag 2018-12-29T19:54:22.082600Z

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

kuzmin_m 2018-12-29T19:54:49.083200Z

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

dottedmag 2018-12-29T19:54:49.083300Z

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

dottedmag 2018-12-29T19:55:08.083800Z

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

dottedmag 2018-12-29T19:55:37.084500Z

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

dottedmag 2018-12-29T19:55:53.085200Z

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

kuzmin_m 2018-12-29T19:56:02.085500Z

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

kuzmin_m 2018-12-29T19:58:13.087400Z

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

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

kuzmin_m 2018-12-29T19:59:21.088100Z

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

dottedmag 2018-12-29T20:04:58.088400Z

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

dottedmag 2018-12-29T20:05:04.088600Z

Это формы.

kuzmin_m 2018-12-29T20:05:23.089100Z

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

dottedmag 2018-12-29T20:05:49.089700Z

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

dottedmag 2018-12-29T20:06:08.090200Z

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

dottedmag 2018-12-29T20:06:23.090600Z

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

kuzmin_m 2018-12-29T20:07:24.090900Z

ок, спасибо

dottedmag 2018-12-29T20:07:54.091500Z

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

dottedmag 2018-12-29T20:08:11.091900Z

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

dottedmag 2018-12-29T20:08:17.092400Z

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

👌 1
dottedmag 2018-12-29T20:10:19.093400Z

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

kuzmin_m 2018-12-29T20:48:02.100Z

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

kuzmin_m 2018-12-29T21:17:15.100400Z

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

razum2um 2018-12-29T21:59:57.102Z

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

👍 4