Fork me on GitHub
#clojure-russia
<
2016-05-09
>
andmed04:05:03

подскажите что хорошего почитать по организации dataflow в clojure для начинающих: если использую reduce, надо протягивать структуру данных вниз, что не нравится (повышает coupling, что по старой привычке не хорошо), мапа же в принципе работает, но тогда у меня получается дикая вложенность структур самих данных, (типа лист мап листов мап) когда это совершенно не нужно и как с этим бороться не очень понятно. и вообще как правильно. 4clojure хороший ресурс но у него упор на отдельные функции, с dataflow в реальных приложениях не очень

bernik09:05:38

@andmed: а какие подходы в организации dataflow ты используешь в неclojure ? ну и, желательно, какой-то пример задачи, в которой у тебя получается дикая вложенность. если задача действительно требует сложных структур данных, тогда можно посмотреть в сторону https://github.com/nathanmarz/specter, но чаще всего нужно разделить одну задачу на кучу меньших и решать большую задачу композицией мелких.

artemyarulin09:05:51

как вариант можно убрать вложенность и сделать более плоской (нормализация это называется или это вроде другое?)

(def data {:order {:products {:id 1 :v 2}}})
;; or
(def data {:order [:products/by-id 1]
           :products/by-id {:id 1 :v 2}})

kronos_vano15:05:38

А что нынче в моде по холивару defrecord vs простой hashmap.

andmed15:05:49

@bernik: из некложи у меня только ооп. там другие подходы: вызываем метод на объекте, ручками обрабатываем в самой процедуре. ни map ни reduce. dataflow отсутствует, а coupling не поощеряется

misha16:05:59

(CL = common lisp)

bernik16:05:31

@andmed: map и reduce это всего лишь частные случаи foreach-ей в твоем ооп коде. в ооп-мире принято, на каждое преобразование писать foreach. в фп-мире для каждого преобразования есть своя функция, из них три главные: * map - если хочется как-то изменить каждый элемент коллекции * filter - если надо отфильтровать элементы коллекции * reduce - если надо получить результат от коллекции вцелом. например, посчитать количество элементов, сгруппировать элементы, отсортировать. не знаю как понятней описать.

andmed16:05:49

@bernik: в моем случае и map и reduce подходят, как лучше -- не знаю

andmed16:05:18

по-другому переменные передаются, я это называю dataflow

bernik16:05:31

@andmed: на самом деле, reduce можно использовать и как map, и как filter. но, как говорится, можно и гвозди микроскопом забивать. по-другому переменные передаются - это да, есть отличия.

andmed16:05:52

с reduce я могу гибче менять структуру данных. мапа навязывает свою структуру. ну пока так видится...

andmed16:05:04

вот что-то про dataflow и хотелось почитать, с практическими примерами, фишками и гвоздями. про ФП и иммутабельными структурами, в идеале -- про кложу

andmed16:05:28

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

bernik17:05:08

@andmed: если тебе по задумке надо получить результат, который по структуре отличается от входной последовательности, тогда тебе нужен reduce, > мапа навязывает свою структуру не понял что ты имел в виду. для почитать могу посоветовать вот это, первые 6 глав, дальше идут монады-функторы-хиндли-милнеры, для начала может быть много. примеры на js-е https://drboolean.gitbooks.io/mostly-adequate-guide/content/index.html

bernik17:05:31

там же, в 6-й главе есть пример приложения с использованием фп подходов.

bernik17:05:05

@andmed: еще в закладках нашел статью, где показано как реализовать паттерны GoF на clojure в сравнении с java. http://mishadoff.com/blog/clojure-design-patterns/

andmed17:05:38

@bernik: о, спасибо, отлично

andmed17:05:17

про навязывание структуры мапой: например, где ожидаю получить мапу на выходе, получаю лист/вектор мап.. .и в таком духе. я наверно просто не умею еще деконструктить правильно, и поэтому думаю про reduce как способ главным образом контролировать выходную структуру..

bernik17:05:03

@andmed: а, ну это просто чтение доков и, если доступны, примеров. http://clojuredocs.org/clojure.core/map

rm17:05:59

другая версия этой картинки содержала "сопротивление бесполезно" и "смирись"

andmed17:05:21

я тоже хотел пошутить на эту тему, но серьезно: получается, вариантов сделать мульон, и гайды что @bernik дал выше про дизайн-паттерн полезны вдвойне. ок, ок, для начинающих

agi_underground22:05:24

привет, может кто подскажет как обработать исключения postgres , такие как HTTP ERROR 500 ?