Anonymous
ну тут типы явно даны
Shub
мне просто интересно, сколько времени займет понять, что тут происходит
Anonymous
можно ж навести мышкой
Anonymous
и увидеть
Shub
ну тут типы явно даны
и как, сильно помогает?
Shub
можно ж навести мышкой
например во время ревью на TFS это аааатлично работает.
Anonymous
хехе, а вы хитрые
Anonymous
я всегда бренч беру
Anonymous
и смотрю в IDE
Shub
я так не делаю, как можно было догадаться. это просто практическое опровержение гипотезы, что якобы некоторые языки спасают от класса проблем как от явления
Dmitry
да, у меня просто уже за полторы сотни стикерпаков, сложно искать
Anonymous
и как, сильно помогает?
это может и не лучший код, но он как минимум нормальный. я понимаю, что можно легче, читаемее. но это нормально. работать с таким можно, редактировать - можно. я бы предпочел читать такое чем SingletonAsyncFactoryBuilder и всю эту адскую поеботу, которая часто бывает в энтерпрайзе.
Anonymous
мне гораздо приятнее видеть 5 строк, пусть и в таком состоянии, которые очень легко можно разложить (даже в уме, при знании минимумальном дела) на более простые кирпичики
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
да С++ хотя бы можно прочитать, если знать С++. тут например знание F# не помогает
а ты можешь конкретнее написать, что именно тебе не нравится?
Shub
ну один момент все же есть. это сидит в отдельном модуле, вокруг которого я выставил кордоны, карантин и три ряда оцепления. и что у меня есть возможность не ходить туда самому, а посылать низшие чины с двумя ведрами гаек
Anonymous
confirmPick <| fcid <| userPicking.state <| request.locationId <| request.thorSku <| request.qty <| request.pickBy <| pickTicketId <| request.cartId <| request.version <| user <| plId
это вообще заходит как дети в школу. я бы так не писал, но елки-палки, нас много, мы разные. я такое читаю слету.
Shub
некоторые умудряются даже какой-то лут оттуда доставать
Shub
впрочем, если б не умудрялись - это был бы абзац, это ж они его и написали
Shub
ты не задумывался, что как минимум в теории каждый <| - это новый стек фрейм и вызов функции?
Shub
я лишь уповаю на аллаха в том, что компилятор достаточно умен, чтобы оптимизировать это все
Anonymous
Крылатый
дикпиком
Shub
не-не, стой. а тебя просили? оптимизировать? кто-то жаловался?
каждый день приходит пачка писем про resources violation
Крылатый
(извините)
Shub
оно жрет память гигабайтами и лейтенси на апишечках измеряется в секундах
Диёр
вот кстати зачем пайп влево юзают вообще
Крылатый
Shub
у нас есть модуль AsyncSeq для работы с последовательностями асинхронок. эти упыри туда передают List
Крылатый
У нас >300 мс на ответ это зашквар.
Anonymous
оно жрет память гигабайтами и лейтенси на апишечках измеряется в секундах
и чо, замеры показывают, что дело таки в стэкфреймах? или хуево спроектированной БД и хевой туче лишних действий без помнимания O(n) и структур данных?
Dmitry
оно жрет память гигабайтами и лейтенси на апишечках измеряется в секундах
ну у меня тут на го понаписаны микросервисы, докер-контейнеры по 1,5-2 ГБ занимают, и время ответа сотни миллисекунд, и ничо
Dmitry
заказчику НОРМ
Shub
мы берем пакет из одного сервиса, немножечко шаманим над ним и складываем в другой сервис.
Shub
в моем проекте нет каких-то тяжелых вычислений, тяжелых запросов в БД, или дикого количества IO
Диёр
а у нас просто не кешируется ничего и база раком стоит
Диёр
Shub
но дело вообще-то не в этом. довольно во многих аспектах мне удалось восстановить дисциплину и если будет на то воля аллаха, через год я все же привью им истинную веру
Shub
вопрос в другом
Shub
как вы считаете, чтобы было, если б был не эфшарп, а сишарп?
Anonymous
как вы считаете, чтобы было, если б был не эфшарп, а сишарп?
конкретно тот кусок бы распидарасило на 5 неймспейсов и 12 классов, три из которых базовых. если пишут профи, то было бы еще 5 интерфейсов. с хуевыми названиями и сомнительным API.
Диёр
как вы считаете, чтобы было, если б был не эфшарп, а сишарп?
было бы тоже самое, ток на наследовании в 20 уровней
Shub
реальные цифры чуть ниже, потому что с какого-то перепугу они юзают расширения типов для типов, объявленных тремя строками выше
Shub
так что типов на самом деле порядка 400
Shub
напомню, что в моем проекте всего 5 (пять) сущностей
Shub
кстати, все это происходит с личной санкции архитектора
Anonymous
напомню, что в моем проекте всего 5 (пять) сущностей
ну 400 у тебя типов. фукнции чистые? надеюсь, да. типы более менее четкие, границы отвественности ясные? если фукнции чистые, то априори -- да.
Shub
пхахаха
Anonymous
ну и че? открываешь код и за 20 минут вникаешь в любой кусок
Shub
что он делает? какие у него гарантии, какие контракты?
Anonymous
ты вник в кусок выше?
не прям вник, но я его понимаю и главное - я четко могу выделить куски ,которые не понимаю и знаю как нужно действовать, чтобы их понять, особенно при условии ЧТО НЕТ СКРЫТОГО СОСТОЯНИЯ
Anonymous
что он делает? какие у него гарантии, какие контракты?
гарнтии и контракты у тебя в инвариантах должны быть, я явном виде, FsCheck вроде никто не отменял
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
ну хочешь я тебе накалякаю как мыслю я при виде этого кода?
Shub
гарнтии и контракты у тебя в инвариантах должны быть, я явном виде, FsCheck вроде никто не отменял
FsCheck у нас служит для гарантий, что если добавить элемент в словарь - то он появится в словаре
Anonymous
а ты скажешь, достаточно ли это или нет
Shub
давай