🌏

【Flutter】Dart3.0~ - Record見やすくしたい

2023/12/16に公開

概要

Dart3.0から導入されたRecordですがみなさん使用していますか?
私はSwiftでアプリ開発をしている際にタプルをよく使用していたため、個人的にはベストバイ機能の一つでした。
ですが、若干記述が面倒だし見づらさもあるなぁと最近思い始めてきました。
かといって都度オブジェクトを生成する程でもないから我慢してRecord使うしかないかなぁ
と思いましたが、なら共通化するかということでしてみました。

実装

単純な方法

typedefを用いて型定義してしまおうというもの

typedef Tuple<T, S> = ({T item1, S item2});

しかしこれだと使用側では通常のRecordを使用するのとあまり差異はありません。
型定義しやすくなっただけにすぎない。

final Tupledef<String, int> tupledef = (item1: '', item2: 0);

ちょっと工夫

定義

class Tuple<T, S> {
  Tuple(this.item1, this.item2);

  final T item1;
  final S item2;

  static _TupleFamily<T, S, Z> family<T, S, Z>(T item1, S item2, Z item3) {
    return _TupleFamily(item1, item2, item3);
  }
}

class _TupleFamily<T, S, Z> {
  _TupleFamily(this.item1, this.item2, this.item3);

  final T item1;
  final S item2;
  final Z item3;
}

使用

final tuple = Tuple('hoge', 1);
print(tuple.item1) // hoge
print(tuple.item2) // 1

final tupleFamily = Tuple.family('hoge', 1, 2);
print(tuple.item1) // hoge
print(tuple.item2) // 1
print(tuple.item3) // 2

final tupleObject = Tuple.family('hoge', 1, Fuga(age: 30, name: 'fuga'));
print(tuple.item1) // hoge
print(tuple.item2) // 1
print(tuple.item3.age) // 30
print(tuple.item3.name) // fuga

基本的にタプルを用いる際には、複数の要素を定義する必要がある場合はクラス化(意味付け)する必要があるため
今回は2 ~ 3つの要素に限定した共通クラスを生成しました。

final tupleObject = Tuple.family('hoge', 1, Fuga(age: 30, name: 'fuga'));

こちらの様に、3つ目の要素にオブジェクト自体を定義することも可能なので、汎用的に使用することが可能です。

補足

  • 上記を検討し、実装まで終えた時に、「自分と同じ気持ちの人いるのでは?」と思いpub.devをちらっとみてみたら。ありました笑
    • https://pub.dev/packages/tuple
    • こちらは、Tuple2 ~ Tuple7までを指定でき、カウントに応じてタプルを指定できるものとのことでした。
      • 個人的には7までも用意したら、煩雑になる可能性が危惧されますし、意味付けのないオブジェクトが乱立してしまう可能性があるため、今回作成した程度で良いのかなと感じました。(好みは分かれると思われます。)

Discussion