DartでResult型とUnion型を併用するのは失敗だった
この記事で紹介した方法は結果的に失敗だった.
Result型と併用しない場合は上手く機能するのだが、Result型と併用しようとすると、致命的な不都合が生じる.
いくつもの syntax sugar を用意しなければならない
一番大きな欠陥であり、それに伴い、そのいくつもある syntax sugar の使い方を把握しなければならなくなってしまう.
これが、契機となり併用を諦めた.
原因の根本は Result型、Union型 ともに Dart の 第一級オブジェクト(第一級概念) ではないこと
Result型とUnion型の相性の良し悪しはここではわからない。両方とも Dart の構文として組み込まれているわけではないため、必ず、冗長になってしまう. 私が試した方法の場合 Result型で値を wrap(つつむ)、さらに Union型でも値を wrap するので、二重に wrap されてしまう. 他には 多態の際にもいくつもの不都合が生じる.
typedef は優れた機能だという発見
これは 型エイリアスを定義する機能で 例えば Future<Result<V, E>>
を FutureResult<V, E>
として扱えるようになる.
ちょっとした冗長さを無くすくらいの機能のように思っていたが、とても応用が利く.
例えば ExceptionA と ExceptionB の Union型を ExceptionAB と定義できる.
先の記事で取り上げたような Result<String, ExceptionA, ExceptionB, ExceptionC>
のような書き方は実際には不便で, 横に長くなりすぎて見切れる, わざわざ改行するのも大仰に感じる.
なので 結局 ExceptionABC というように扱いたい.
Result型との併用は失敗だが, 併用しない箇所でのUnion型の利用には今のところ問題なし
まあ、使いどころ自体が少ない.
Exception の定義は自動化する方向に
Dartで第一級概念として扱われない限りは ExceptionABC を地道に implements とか sealed 機能を使って逐一定義し、この定義の仕方を形式化して、自動で code を生成する予定.