Skip to content

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

Result 型の Exception の表現として

Dart で Result 型を使うにあたり 複数の exception を返すときに Union 型を使いたいと思った。 イメージ。ちなみに Result 型も自前で実装。

Result<String, Union3<ExceptionA, ExceptionB, ExceptionC>> xxx() {...}

Union 型なしでこれを表現する場合

seald class ExceptionABC {}
class ExceptionA implemtents ExceptionABC {}
class ExceptionB implemtents ExceptionABC {}
class ExceptionC implemtents ExceptionABC {}
Result<String, ExceptionABC> xxx() {...}

逐一、ExceptionABC のような class を定義し それぞれに implements する。 例のように 3つだけならそこまでの労力はないが、数も増え、組み合わせも増え、開発中に修正が入ったりすると、ExceptionABC のような専用 class を定義し それぞれに implements していくのはかなり大変であり記入ミスも心配しなければならなくなる。 この Union 型でそれらの面倒事を解消することを期待する。

Union 型の最小構成の実装例


abstract class UnionType
{
    Object get wrapped;
}

sealed class Union2<
        T1 extends Object
        ,T2 extends Object
    >
    extends
        UnionType
{}

final class Union2First<
        T1 extends Object
        ,T2 extends Object
    >
    extends
        Union2<T1, T2>
{

    final T1 wrapped;

    Union2First(this.wrapped);

}

final class Union2Second<
        T1 extends Object
        ,T2 extends Object
    >
    extends
        Union2<T1, T2>
{

    final T2 wrapped;

    Union2Second(this.wrapped);

}

void intPrint(int value) {
    print(value);
}

void stringPrint(String value) {
    print(value);
}

void union2Print(Union2<String, int> union2) {

    switch (union2) {
        case Union2First(): stringPrint(union2.wrapped);
        case Union2Second(): intPrint(union2.wrapped);
    }

}

void main() {

    final union2First = Union2First<String, int>('string value');
    final union2Second = Union2Second<String, int>(1);

    union2Print(union2First);
    union2Print(union2Second);

}