Size: a a a

Clojure — русскоговорящее сообщество

2020 August 06

Г

Григорий in Clojure — русскоговорящее сообщество
Добрый день. В продолжение к моим вчерашним вопросам: я все равно не понимаю как грамотно реализовать юзкейс экспортируемых сущностей.

Пишу протокол:
(defprotocol Exportable
 (export [this to & params]))

И потом хочу использовать что-то вроде:
(defrecord ParentalReport [child tested-parents maybe-parent locus-similarities meta]
 Exportable
 (export [this :excel params]
        (print "exporting to excel...")))


Так, конечно, не получается. Подскажите какие абстракции тут выгодно использовать. Уверен, что такой юзейкс почти у каждого в проекте встречался.
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Григорий
Добрый день. В продолжение к моим вчерашним вопросам: я все равно не понимаю как грамотно реализовать юзкейс экспортируемых сущностей.

Пишу протокол:
(defprotocol Exportable
 (export [this to & params]))

И потом хочу использовать что-то вроде:
(defrecord ParentalReport [child tested-parents maybe-parent locus-similarities meta]
 Exportable
 (export [this :excel params]
        (print "exporting to excel...")))


Так, конечно, не получается. Подскажите какие абстракции тут выгодно использовать. Уверен, что такой юзейкс почти у каждого в проекте встречался.
для каких целей вообще defrecord?
источник

DK

Denis Krivosheev in Clojure — русскоговорящее сообщество
Протоколы работают по типам, то есть нужен рекорд для экселя, рекорд для csv и так далее
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
я бы не рекомендовал вообще заморачиваться мультиметодами пока точно не понятно в каких случаях они дают ощутимое удобство
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Оу. Понял. Тогда как это элегантно провернуть?
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
написать cond и в нем три кейса :)
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Просто defn export и все?
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Григорий
Добрый день. В продолжение к моим вчерашним вопросам: я все равно не понимаю как грамотно реализовать юзкейс экспортируемых сущностей.

Пишу протокол:
(defprotocol Exportable
 (export [this to & params]))

И потом хочу использовать что-то вроде:
(defrecord ParentalReport [child tested-parents maybe-parent locus-similarities meta]
 Exportable
 (export [this :excel params]
        (print "exporting to excel...")))


Так, конечно, не получается. Подскажите какие абстракции тут выгодно использовать. Уверен, что такой юзейкс почти у каждого в проекте встречался.
А тут разве нельзя оставить открытым куда экспортировать?
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Григорий
Просто defn export и все?
лучше начинать от задачи целиком
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Задача в том, что некоторые сущности могут быть экспортированы в другие форматы: excel, cvs, pdf, json. Как это элегантно описать в коде?
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Григорий
Задача в том, что некоторые сущности могут быть экспортированы в другие форматы: excel, cvs, pdf, json. Как это элегантно описать в коде?
кмк лучше всего написать функции-экспортёры (export-json, export-cvs, etc), а к тому что именно экспортировать лучше не привязываться
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Не, это важно. Что экспортировать — важно.
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Григорий
Не, это важно. Что экспортировать — важно.
Почему? Чем отличнаются ваши сущности?
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Потому что разные отчеты можно очень по-разному представлять в pdf, в excel и где угодно.
источник

VK

Vadim Komarov in Clojure — русскоговорящее сообщество
Почему не сделать две функции? Одна формирует данные, но ничего не знает о формате, в который они будут преобразованы. Вторая принимает данные, преобразует в нужный формат, но ничего не знает о том, откуда они пришли.
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Григорий
Потому что разные отчеты можно очень по-разному представлять в pdf, в excel и где угодно.
Всё равно не до конца понял) Отчет это же набор полей? И у вас есть 2 условия - как отобразить и куда
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Vadim Komarov
Почему не сделать две функции? Одна формирует данные, но ничего не знает о формате, в который они будут преобразованы. Вторая принимает данные, преобразует в нужный формат, но ничего не знает о том, откуда они пришли.
Вот примерно так, да
источник

DK

Denis Krivosheev in Clojure — русскоговорящее сообщество
Я бы сделал по протоколу на каждую трансформацию
->xls
->pdf
И так далее. И каждый тип который хочет иметь эту трансформацию реализовал бы эти протоколы
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Можно "псевдо" код показать?
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Вашего предложения
источник