Anonymous
ну тут типы явно даны
Shub
мне просто интересно, сколько времени займет понять, что тут происходит
Anonymous
можно ж навести мышкой
Anonymous
и увидеть
Anonymous
хехе, а вы хитрые
Anonymous
я всегда бренч беру
Anonymous
и смотрю в IDE
Dmitry
Hog
Shub
я так не делаю, как можно было догадаться. это просто практическое опровержение гипотезы, что якобы некоторые языки спасают от класса проблем как от явления
Dmitry
да, у меня просто уже за полторы сотни стикерпаков, сложно искать
Anonymous
и как, сильно помогает?
это может и не лучший код, но он как минимум нормальный. я понимаю, что можно легче, читаемее. но это нормально. работать с таким можно, редактировать - можно. я бы предпочел читать такое чем SingletonAsyncFactoryBuilder и всю эту адскую поеботу, которая часто бывает в энтерпрайзе.
Крылатый
Anonymous
мне гораздо приятнее видеть 5 строк, пусть и в таком состоянии, которые очень легко можно разложить (даже в уме, при знании минимумальном дела) на более простые кирпичики
Крылатый
let handleEvents
(agBuilder:AgBuilder<'Id,'St,'Ev>)
(get:AgLoader<'Id,'St>)
(put: Ag<'Id,'St> -> 'Ev list -> Async<Choice<'Ev list * int, 'Err list>>)
(f:AsyncArrow<'Input * Ag<'Id,'St>, Choice<'Ev list, 'Err list>>) : AsyncArrow<'Input*'Id, Choice<'Ev list*'St*int, 'Err list>> =
fun (inp,iden)
Выгдядит как с++
Shub
да С++ хотя бы можно прочитать, если знать С++. тут например знание F# не помогает
Shub
у нас еще любят делать вот такие вещи
Shub
confirmPick
<| fcid
<| userPicking.state
<| request.locationId
<| request.thorSku
<| request.qty
<| request.pickBy
<| pickTicketId
<| request.cartId
<| request.version
<| user
<| plId
Shub
мол, красиво отформатированный код
Anonymous
Shub
Anonymous
Shub
ну один момент все же есть. это сидит в отдельном модуле, вокруг которого я выставил кордоны, карантин и три ряда оцепления. и что у меня есть возможность не ходить туда самому, а посылать низшие чины с двумя ведрами гаек
Anonymous
Shub
некоторые умудряются даже какой-то лут оттуда доставать
Shub
впрочем, если б не умудрялись - это был бы абзац, это ж они его и написали
Shub
ты не задумывался, что как минимум в теории каждый <| - это новый стек фрейм и вызов функции?
Dmitry
Shub
я лишь уповаю на аллаха в том, что компилятор достаточно умен, чтобы оптимизировать это все
Anonymous
Hog
Крылатый
дикпиком
Shub
Крылатый
(извините)
Shub
оно жрет память гигабайтами и лейтенси на апишечках измеряется в секундах
Диёр
Vladislav
Диёр
вот кстати зачем пайп влево юзают вообще
Крылатый
Vladislav
Hog
Shub
у нас есть модуль AsyncSeq для работы с последовательностями асинхронок. эти упыри туда передают List
Крылатый
У нас >300 мс на ответ это зашквар.
Anonymous
Shub
Dmitry
заказчику НОРМ
Shub
мы берем пакет из одного сервиса, немножечко шаманим над ним и складываем в другой сервис.
Shub
в моем проекте нет каких-то тяжелых вычислений, тяжелых запросов в БД, или дикого количества IO
Диёр
а у нас просто не кешируется ничего и база раком стоит
Диёр
Shub
но дело вообще-то не в этом. довольно во многих аспектах мне удалось восстановить дисциплину и если будет на то воля аллаха, через год я все же привью им истинную веру
Shub
вопрос в другом
Крылатый
Shub
как вы считаете, чтобы было, если б был не эфшарп, а сишарп?
Диёр
Shub
Shub
реальные цифры чуть ниже, потому что с какого-то перепугу они юзают расширения типов для типов, объявленных тремя строками выше
Shub
так что типов на самом деле порядка 400
Shub
напомню, что в моем проекте всего 5 (пять) сущностей
Shub
кстати, все это происходит с личной санкции архитектора
Shub
пхахаха
Anonymous
ну и че? открываешь код и за 20 минут вникаешь в любой кусок
Shub
Shub
что он делает? какие у него гарантии, какие контракты?
Anonymous
ты вник в кусок выше?
не прям вник, но я его понимаю и главное - я четко могу выделить куски ,которые не понимаю и знаю как нужно действовать, чтобы их понять, особенно при условии ЧТО НЕТ СКРЫТОГО СОСТОЯНИЯ
Shub
Shub
вот тебе пример использования тех типов, прям полная функция
Shub
let handle2NoVersion
(ag1: AgUpdator<'Id1,'St1,'Ev1>)
(ag2: AgUpdator<'Id2,'St2,'Ev2>)
(f:AsyncArrow<'Input * Ag<'Id1,'St1> * Ag<'Id2,'St2>, Choice<'Ev1*'Ev2>>) : AsyncArrow<'Input*'Id1*'Id2, Choice<'Ev1*'Ev2>> =
handle2 ag1 ag2 f |> AsyncArrow.mapOut (Choice.mapl (fun (e1,e2,_,_) -> (e1,e2)))
Shub
функция-однострочник, за 20 минут разберешься же?
Anonymous
ну хочешь я тебе накалякаю как мыслю я при виде этого кода?
Anonymous
а ты скажешь, достаточно ли это или нет
Shub
давай