Skip to content

DartでResult型とUnion型を併用するのは失敗だった

Union型でResult型の表現力を上げる(Dart)

この記事で紹介した方法は結果的に失敗だった.

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 を生成する予定.