В данной статье я хочу показать, почему развитая система типов в языке программирования это здорово. Я попробую провести небольшой ликбез о таких на первый взгляд сложных вещах, как sealed-иерархии, ковариантность и тип Nothing на понятном практическом примере создания своей реализации типа из функционального программирования Either.
Функциональный подход обработки ошибок в Dart
При переходе на новую технологию, мы лишаемся привычных инструментов для разработки. В каких-то случая мы вынуждены смириться с их отсутствием из-за каких-то технических ограничений, но при возможности переносим инструменты с собой. Разрабатывая android приложения, за основу я брал пример чистой архитектуры предложенной Fernando Cejas. Разбираясь с используемыми во Flutter шаблонами проектирования, я решил отказаться от этой архитектуры в пользу BLoC. К данному шаблону я быстро привык, он очень похож на MVVM, с которым работал ранее, но с одной деталью я никак не хотел мириться. При вызове методов репозитория я должен был ловить исключения, кастить их к какому-то типу и в соответсвии с типом, создавать необходимое состояние. На мой взгляд, это очень захламляет блок и я портировал тип Either используемый ранее в android проектах, основанных на Fernando.
Функциональный C#
Как обрабатывать ошибки на JVM быстрее
Существуют различные способы обработки ошибок в языках программирования:
- стандартные для многих языков исключения (Java, Scala и прочий JVM, python и многие другие)
- коды статуса или флаги (Go, bash)
- различные алгебраические структуры данных, значениями которых могут быть как успешные результаты так и описания ошибок (Scala, haskell и другие функциональные языки)
Исключения используются очень широко, с другой стороны о них часто говорят, что они медленные. Но и противники функционального подхода часто апеллируют к производительности.
Последнее время я работаю со Scala, где в равной мере я могу использовать как исключения так и различные типы данных для обработки ошибок, поэтому интересно какой из подходов будет удобнее и быстрее.
Сразу отбросим использование кодов и флагов, так как этот подход не принят в JVM языках и по моему мнению слишком подвержен ошибкам (прошу прощения за каламбур). Поэтому будем сравнивать исключения и разные виды АТД. Кроме того АТД можно рассматривать как использование кодов ошибок в функциональном стиле.
UPDATE: к сравнению добавлены исключения без стек-трейсов
Ошибки, RxJS & Angular
Что привлекает в Ангуляре экспертов и удручает начинающих? Одно и тоже, RxJS.
Почему же это так сложно для начинающих? Возможно потому, что есть очень большое количество операторов, которые нужно просто знать, и без поиска понимать в чем разница между concatMap, switchMap и mergeMap. Почему же это так нравится тем, кто это уже выучил? Возможно, потому что вы начинаете понимать все могуществао RxJS, когда одним оператором вы можете сделать то, что в императивном коде писали бы полдня на двух страницах. Ведь это так приятно, ощущать себя богом, когда код просто отскакивает от ваших пальцев, а вы радостно рассказываете коллегам как вы классно и главное просто решили задачу.
Монады на JS/TS в дикой жизни
Идея разобраться в теме монад меня привлекала уже очень давно. Сложность описания концепций представляло не только мою личную проблему, но и была потенциальной проблемой для коллег. Ведь хотелось не просто в них разобраться, а работать с ними каждый день. Функциональное программирование неплохо формирует мышление, является очень выразительным и часто лаконичным решением. Ниже идет описание опыта разработки с применением библиотек монад на JS / TS.