Kotlin Result DSL

Kotlin Result DSL

d_r_q

И кстати в догонку про обработку ошибок.


Я в своё время прям сильно впечатлился Rust-овским try! (Который уже оказывается стал ?-оператором)


И недавно запилил драфт похожей для штуки для Котлина:

Пример использования Result DSL



Это аналог вот такому коду:

Аналогичный код без Result DSL


Совсем однострочник сделать не получается, т.к. в Котлине нет полноценных макросов, а для того чтобы это приём абстрагировать в функцию, в ней надо сделать ретарн из произвольной вызывающей функции с неизвестным типом возврата.


Но спрашивается зачем всё это?


В Котлине возврат того или иного Result - это единственный способ явно показать вызывающему коду, что функция может ошибиться. А очевидность вообще и очевидность мест где что-то может пойти не так - это основа эргономичного кода.

Но если это делать наивно, то получается код как из втрого примера.

Вообще Result-ы как правило являются монадами и с ними можно работать так:

Обработка ошибок с монадами


И так получается даже короче. Но (в Котлине по крайней мере) монады не масштабируются.

Например, если надо выполнить ИО-операцию на базе результата первых двух (и только в случае их успеха), то будет вот такой адок:

Композиция "результативных" методов с монадами в Котлине

С моим же DSL-ем, всё будет прилично:

Композиция "результативных" методов с Result DSL

Полный код DSL-я


Report Page