Control flow as a type
May. 24th, 2024 10:24 amЧем больше я про это думаю, тем больше я его хочу.
Любое замыкание (в расте) может управлять control flow приложения, но только в смысле panic!. Замыкание не может управлять другим control flow, например, break/continue/return.
Это делает не экивалентным цикл итератора и применение map для того же самого итератора. Несправедливо! Если бы только компилятор понимал управление control flow и мог правильно проверить его совместимость...
Любое замыкание (в расте) может управлять control flow приложения, но только в смысле panic!. Замыкание не может управлять другим control flow, например, break/continue/return.
Это делает не экивалентным цикл итератора и применение map для того же самого итератора. Несправедливо! Если бы только компилятор понимал управление control flow и мог правильно проверить его совместимость...
no subject
Date: 2024-05-25 05:25 am (UTC)Вообще мысли вида «хочу иметь
break/continue/returnexpr/throwexpr в виде first-class значения» обычно приходят при попытке применить рефакторинг Extract Method к куску говнокода, где на входе коллекция, потом по нейforвыше человеческого роста, а внутри этогоfor’а — вышеупомянутые управляющие конструкции в ассортименте.no subject
Date: 2024-05-27 09:28 am (UTC)Хочется эти ответы и проверки вынести в отдельные функции.
Например, представь себе, обычный for-цикл по коллекции (без права на спекулятивное чтение, то есть ты не знаешь длины итератора и не можешь делать peek).
Теперь у тебя есть пять решений: break, continue, return (math for(i)), update context, pass.
Каждое i должно быть обработано каждой из 10000 функций KYC/AML подразделения, которое делает всякую фигню (включая запрос фотки задницы на фоне задней страницы паспорта).
Как ты такое напишешь? Разумеется, ты сделаешь рефакторинг, чтобы тебе такое не надо было писать. Но рефакторинг ты сделаешь, потому что тебе инструмент не позволяет.
no subject
Date: 2024-05-27 10:04 am (UTC)А характерный размер коллекции (из которой каждое i)?
Потому что при таком размере внутреннего цикла я буду серьёзно задумываться, что, может, нам нужно не гнездо из двух вложенных циклов и не двухэтажный мап-мап-фильтер, а какой-то дейта-пайплайн о десяти тысячах и двух вершинах. возможно распределённый.
no subject
Date: 2024-05-27 10:07 am (UTC)Если коду было позволено разрастись до более чем трёх-пяти требований в одном цикле и тот рефакторинг, который ты описываешь, ещё не сделан — это говнокод.
no subject
Date: 2024-05-29 10:47 am (UTC)no subject
Date: 2024-05-29 12:15 pm (UTC)Ну и? Надо сесть за моделирование и тип возврата этих функций-требований сформулировать в терминах предметной области («этому разрешить без очереди и без дальнейших проверок», «да, если не противоречит другим проверкам», «минус десять очков Гриффиндору», «ни за что и никогда»), а не в терминах управляющих конструкций того цикла, в котором перебираются проверки.
Если проверки одного клиента влияют на результаты проверок для других (например, у нас ограниченный ресурс), то, значит, у нас опять не задача на map-map-filter, а на map-map-sum-sort-take 100.