@Fsharp_chat

Страница 691 из 772
Friedrich
03.09.2018
03:33:12
Бонусные баллы, если сделаешь это без использования лишнего внешнего блока task (внутри у тебя и так уже таск есть)

Friedrich
03.09.2018
03:34:01
Ну, это просто мои мысли. Дальше уже дело автора — что менять, а что нет по результатам моего ревью

Google
Friedrich
03.09.2018
03:34:35
Вроде всё прочитал. Мне апишечка тамошняя не нравится. Мне кажется, она будет вот так убого выглядеть что из F#, что из C#.

Если хочется сделать красивый код — я бы заврапал её в чуть большее количество функций, которые бы можно было по-отдельности протестировать, например.

Grigoriy
03.09.2018
03:35:07
Polly?

Friedrich
03.09.2018
03:35:28
SftpClient срамной

Grigoriy
03.09.2018
03:35:40
О, да

Friedrich
03.09.2018
03:35:45
Async.FromBeginEnd это ни в какие ворота, да :)

Polly в данном случае мне тоже не нравится, но её уже только из F# неудобно использовать. Мб вот она — хороший кандидат на то, чтоб заврапать

Friedrich
03.09.2018
03:59:27
А как их потом в Async.Parallel запихнуть?
А ты их запихивай в Task.WhenAll!

Ну, впрочем, это уже повод задуматься про асинк — может быть, он тут пригодится, ок :)

У тасков больно уж убогонький API для получения результата синхронно.

Google
Friedrich
03.09.2018
04:01:10
Но тогда можно, например, так: tasks |> Seq.map Async.AwaitTask |> Async.Parallel |> Async.RunSynchronously Предпочесть этот или тот подход — вопрос, скорее, философский.

Можно прикинуть, где аллокаций больше будет, и вот это всё, но по сути однофигственно, используй какой больше нравится.

Evgeniy
03.09.2018
04:25:47
А object expressions может в проперти? Не могу найти пример использования
Может. Только с List<T> проблема в том, что Count — sealed.

@PimenovDenis А что у тебя за задача? Может ее как-то иначе можно решить?

Vladimir
03.09.2018
05:12:09
try return Ok x() with | ex -> return Error ex Попахивает паттерном. Предлагаю вынести в отдельную функу, а то там и так уже уровней вложенности слишком уж много :)
Я как раз недавно коллегу за такое отчитывал) Думаю, что эксепшны возвращать это плохой паттерн. Или их кидать надо, или свои эрроры возвращать

Friedrich
03.09.2018
05:12:51
Я как раз недавно коллегу за такое отчитывал) Думаю, что эксепшны возвращать это плохой паттерн. Или их кидать надо, или свои эрроры возвращать
Ну, тут от задачи зависит. В данном случае нормально, кажется? Представь, как раскукожит Async.Parallel, если таски в нём начнут завершаться ошибками.

Vladimir
03.09.2018
05:15:09
Согласен) Я скорее про паттерн) что в общем так делать не нужно, только в спец случаях

Friedrich
03.09.2018
05:16:03
Да, соглашусь.

Friedrich
03.09.2018
05:50:16
Аллокации - посмотреть в fsi ?
Я скорее имел в виду «обдумать» :)

Grigoriy
03.09.2018
05:53:03
Да можно ж оба варианта запустить в fsi и посмотреть :)

Friedrich
03.09.2018
05:54:30
Что посмотреть? FSI где-то собирает статистику по аллокациям?

Grigoriy
03.09.2018
05:55:37
Кстати - там же не эксепшон возвращается, а Error of string

fsi вроде при #time "on" пишет не только время выполнения, но и статистику GC

Friedrich
03.09.2018
05:59:59
Надо же, я этого не знал / забыл.

Grigoriy
03.09.2018
06:05:37
Но спасибо за идею - буду экспериментировать!

Aleksander
03.09.2018
06:23:11
По поводу эксепшена - в некоторых случаях и правильно что после эксепшена всё падает. Мы 3 раза честно попытались с полли, если там коннекта нет, то смысл пробовать для каждого файла (а если их там 10 000)? Другое дело, что могут быть ошибки специфичные для конкретного файла - например если файл уже существует на SFTP - имхо как раз такие случаи лучше перехватывать и выносить в Result.

Про connect / disconnect на каждый аплоад - так конечно проще и надежнее, но у меня был случай когда коннект сам по себе занимал 5-10 секунд, а заливка файла укладываласть в 100мс.

Google
Grigoriy
03.09.2018
06:25:39
Это в примере загрузка всех файлов на локалхост. В реальной жизни все фтп разные. Не смогли загрузить один - не значит, что все остальные не получится (я из за этого-то и начал этот огород городить)

К коннекту это тоже относится.

Bonart
03.09.2018
06:26:16
Я как раз недавно коллегу за такое отчитывал) Думаю, что эксепшны возвращать это плохой паттерн. Или их кидать надо, или свои эрроры возвращать
Почему плохой? В объекте исключения есть все типовая информация об ошибке из коробки. Свой велосипед в 99% случаев будет не лучше

Grigoriy
03.09.2018
06:31:24
Почему плохой? В объекте исключения есть все типовая информация об ошибке из коробки. Свой велосипед в 99% случаев будет не лучше
Тогда надо совсем по-иному делать - try catch внутри таска должен разбить все эксепшоны на ретраибл и нет. В полли указать этот тип, чтобы продолжать попытки, когда это нужно...

Много чего можно навернуть :)

Bonart
03.09.2018
06:37:25
Тогда надо совсем по-иному делать - try catch внутри таска должен разбить все эксепшоны на ретраибл и нет. В полли указать этот тип, чтобы продолжать попытки, когда это нужно...
А в честь чего вдруг таск знает при каких исключениях надо повторять? Политику обработки исключений желательно иметь отдельно. Опять-таки и в этом случае велосипедная конструкция вместо исключения будет хуже.

Bonart
03.09.2018
06:49:15
Я же говорю - до бесконечности улучшать. Именно поэтому ретрай стоит просто - на любой эксепшн.
У Реймонда Чена была очень проникновенная статья про ретрай на любую ошибку. Особенно если этот ретрай вложенный.

Friedrich
03.09.2018
06:50:27
На любую никто не предлагает

Grigoriy
03.09.2018
06:51:32
https://blogs.msdn.microsoft.com/oldnewthing/20051107-20/?p=33433

Прочитал Чена. Познавательно. Напоминает хрестоматийный пример (не про ритрай) про программу спутника, один модуль которой ожидал, что все величины в СИ, а другой - в имперской.

У меня вывод из статьи немного иной - не ретраи опасны, а мискоммуникация

Vladimir
03.09.2018
07:30:30
и 30-секундные таймауты)

Почему плохой? В объекте исключения есть все типовая информация об ошибке из коробки. Свой велосипед в 99% случаев будет не лучше
Потому что как правильно обработать эксепшн лучше всего как раз в том месте где этот эксепшн произошел. Если не знаешь как - кидай эксепшн дальше, если знаешь - передавай DU с эррором. Передавать эксепшн очень странно, как будто это ожидаемый результат

Evgeniy
03.09.2018
07:43:57
https://eiriktsarpalis.wordpress.com/2017/02/19/youre-better-off-using-exceptions/

Roman
03.09.2018
07:44:24
https://twitter.com/zaid_ajaj/status/1036369062408998912?s=09

Google
Roman
03.09.2018
07:47:20
Поддержу. Польза DU для ошибок в том, что это закрытое множество. Чуть больше информации о поведении функции. :)
@antyadev в докладах говорил о том, что для неожиданных исключений они делали метку type Exceptions = ... | Bug of Exception И изучали его

Evgeniy
03.09.2018
07:48:38
Мне кажется, в этом смысла уже меньше.

Roman
03.09.2018
07:49:45
Для большого приложения есть смысл. Неучтеные состояния явно тегаются и впоследствии их можно учесть.

Vladimir
03.09.2018
07:50:03
ну я думаю что смысл тут отделить методы которые могут бросать эксепшны от тех которые не могут

но что-то кажется, что любые методы могут их бросать)

Friedrich
03.09.2018
07:51:50
ThreadAbortException может кто угодно бросить.

Любой GC safepoint, если я правильно помню.

Vladimir
03.09.2018
07:53:25
да и баг где угодно может быть)

Vasily
03.09.2018
07:53:44
Roman
03.09.2018
07:58:10
Опять говнопример
Ищи возможности!)

Vasily
03.09.2018
08:00:27
Я к тому, что в выбранной архитектуре довольно тяжело прокинуть имя темплейта для отображения, например

А для wpf это критично

Evgeniy
03.09.2018
08:07:22
Опять говнопример
Нормальный пример.

Roman
03.09.2018
08:19:50
Привет! Знаком с F#?

Roman
03.09.2018
08:23:07
ThreadAbortException может кто угодно бросить.
Но его и ловить бесполезно

Evgeniy
03.09.2018
08:23:49
Roman
03.09.2018
08:26:02
Friedrich
03.09.2018
08:30:19
Google
Roman
03.09.2018
08:31:15
Объясни.
Всмысле все что с тегом Bug в логах отправляется на внимательное изучение. И исправляется.

Evgeniy
03.09.2018
08:32:38
Всмысле все что с тегом Bug в логах отправляется на внимательное изучение. И исправляется.
А в чем отличие от нежданных исключений, которые ловятся где-то наверху и записываются в лог?

Bonart
03.09.2018
08:33:18
Но его и ловить бесполезно
Его глушить бесполезно. А ловить и освобождать ресурсы смысл есть.

Roman
03.09.2018
08:33:44
ок согласен

Nikolay
03.09.2018
08:34:45
В другом чате спамит

Доставай банхаммер

Roman
03.09.2018
08:35:07
А в чем отличие от нежданных исключений, которые ловятся где-то наверху и записываются в лог?
В том, что они все же обработанные и вполне себе укладываются в состояние приложения. Т. е. Разработчик учитывает в контролфлоу состояние возможного бага и не полагается на Exception в контролфлоу

Доставай банхаммер
Он у тебя давно

Nikolay
03.09.2018
08:36:13
done

Насколько давно? :D

А то я всё фридриха зову

Roman
03.09.2018
08:36:24
А в чем отличие от нежданных исключений, которые ловятся где-то наверху и записываются в лог?
как я понимаю, есть ожидаемые косяки (файл не найден, коннекшн оборвался), а есть ошибки, допущенные при написании кода, типа нулл референса. И иногда их удобно обрабатывать и логировать по-разному

Roman
03.09.2018
08:36:26
Nikolay
03.09.2018
08:36:34
Аа, ладно

Roman
03.09.2018
08:36:39
:D

Vasily
03.09.2018
08:55:32
Нормальный пример.
С точки зрения реального программирования - нет

Я там выше озвучил , почему

Vladimir
03.09.2018
09:20:58
Всмысле все что с тегом Bug в логах отправляется на внимательное изучение. И исправляется.
Unhandled эксепшны в логах тоже должны отправляться на внимательное изучение =)

Vasily
03.09.2018
09:21:33
Unhandled эксепшны в логах тоже должны отправляться на внимательное изучение =)
В теории их быть не должно, конечно. Но это в теории

Страница 691 из 772