Size: a a a

Saint P Ruby Community

2020 February 03

AG

Alex G in Saint P Ruby Community
вот если писать императивный код на монадках, то и некоторые проблемы исключений всплывут.
источник

AG

Alex G in Saint P Ruby Community
например, можно потерять "контекст", если "забыть" обработать failure на нужном уровне
источник

IM

Igor Morozov in Saint P Ruby Community
а какой именно контекст? откуда значение пришло?
источник

AG

Alex G in Saint P Ruby Community
ну так, сейчас надо будет подключить фантазию :)

пусть есть"сервисы" A, B, C, D.
А дерагает B, B дергает C и D  
в D возникает Failure, у B есть знание, как его обработать c учетом С (можно ли сделать ретрай/сформировать понятную ошибку/еще что-то)
в А нет данных, которые появились у B в процессе работы
источник

AG

Alex G in Saint P Ruby Community
  call_a
     call_b
         call_c
         call_d
источник

AD

Anton Davydov in Saint P Ruby Community
Alex G
ну так, сейчас надо будет подключить фантазию :)

пусть есть"сервисы" A, B, C, D.
А дерагает B, B дергает C и D  
в D возникает Failure, у B есть знание, как его обработать c учетом С (можно ли сделать ретрай/сформировать понятную ошибку/еще что-то)
в А нет данных, которые появились у B в процессе работы
странный пример на самом деле, у тебя в цепочке есть сервис, который знает что-то про форматирование результата
источник

AG

Alex G in Saint P Ruby Community
это было в скобочках, можно не обращать внимание. неудачный пример :)
источник

AG

Alex G in Saint P Ruby Community
исправил опечатку: в D возникает Failure, у B есть знание, как его обработать c учетом D (конечно с учетом C)
источник

IM

Igor Morozov in Saint P Ruby Community
А, ну тут да. Эти штуки не отличаются.

Тут непонятно, проблема ли это — кажется, тут как раз задача в том, чтоб начать думать о тех данных, которые нужны для обработки ситуации.

У тебя есть знание, что есть значение какого-то типа, и в нём весь контекст. Чистота
источник

AG

Alex G in Saint P Ruby Community
Igor Morozov
А, ну тут да. Эти штуки не отличаются.

Тут непонятно, проблема ли это — кажется, тут как раз задача в том, чтоб начать думать о тех данных, которые нужны для обработки ситуации.

У тебя есть знание, что есть значение какого-то типа, и в нём весь контекст. Чистота
Это же в контексте разговора про минусы исключений. Что их легко забыть отловить.  Это странный аргумент, потому что забыть можно что угодно )
источник

IM

Igor Morozov in Saint P Ruby Community
А, тут да. Это правда
источник

IM

Igor Morozov in Saint P Ruby Community
Забыть обработать фейлур, если ты не обмазываешься Do повсюду, ещё проще
источник

IM

Igor Morozov in Saint P Ruby Community
был как-то кейс, когда посреди цепочки появился Failure, но его никто не пытался даже через value! распаковать, и тесты не отловили

но закончилось хорошо
источник

AG

Alex G in Saint P Ruby Community
а еще про hidden control flow
http://nywkap.com/programming/either-monads-ruby.html#hidden-control-flow

c do-notation и railway oriented programming эта проблема появляется тоже
источник

AG

Alex G in Saint P Ruby Community
можно понаписать

yield call_a
  yield call_b
    yield call_c
    yield call_d


И понимать, что с любой строчки ты в теории улетаешь вверх
источник

AG

Alex G in Saint P Ruby Community
причем достоверно неизвестно на какой уровень
источник

IM

Igor Morozov in Saint P Ruby Community
> причем достоверно неизвестно на какой уровень

не понял, почему? 🤔

ровно на уровень вверх же улетаешь
источник

AG

Alex G in Saint P Ruby Community
источник

AG

Alex G in Saint P Ruby Community
я там про ROP упомянул не зря. Можно написать так, что обработка на уровне выше будет опциональным решением
источник

IM

Igor Morozov in Saint P Ruby Community
Там еще есть диаграммы, где оба трека заезжают в функцию. Я не понял, почему ду это такой способ
источник