🔎

get とfetch(失敗学)

2023/10/24に公開

後日追記
 これはあくまで一つの見方であって、例えば
 条件分岐して、いちいち条件を確認しながら作業をするより、
 一対一対応で、ムダな確認なしに処理した方が早いじゃん、
 とか、そういうことを考えているわけではありません。

ちゅーとりあるにちゅーじつ

serverpodでは、まずendpointに関数を作る。
例えばこんな。

  Future<List<Principal>> getPrincipal(Session session,
      {List<String>? keywords}) async {
    var whereClause;
    if (keywords != null && keywords.isNotEmpty) {
      for (var keyword in keywords) {
        if (whereClause == null) {
          whereClause = Principal.t.location.like('%$keyword%');
        } else {
          whereClause = whereClause | Principal.t.location.like('%$keyword%');
        }
      }
    } else {
      whereClause = Constant(true);
    }
    return await Principal.find(
      session,
      where: (_) => whereClause,
      orderBy: Principal.t.point, 
    );
  }

で、それをFlutterから呼ぶ。

  Future<void> fetchPrincipal({List<String>? location}) async {
    try {
      print(location);
      _principal = await client.principal.getPrincipal(keywords: location);
    } on Exception catch (e) {
      debugPrint('$e');
    }
  }

迷走の始まり

tutorialには、単純なcodeしか載っていない。CRUDが一つずつ、とか。
でも、実際にアプリをつくっていれば、いろんな関数をつくることになる。
独学迷走の徒である私は、get関数を作るたびに、それ専用のfetch関数も作った。
そういうものだと信じて疑わなかった。
関数を一つだけ使う状況なら、それでも別に構わない、わかりやすいとも言える。
でも、条件分岐して関数を使い分けるぞ、というだんになって、問題が起こった。
コードが無限に長くなっていく。
そう、悲しいかな私は、分岐に対していちいち専用のfetch関数を填めたのだ。

getとfetchは一対一対応ではない

なんだ、get関数だけ入れ替えればいいんじゃん!
これに気づくまでに、ずいぶん時間を無駄にしてしまった。
もちろん、分岐ごとの引数をkeyで指定する、みたいな手間は要るけれども、
それだって、これでずいぶん短くなるでしょうよ。

  Future<List<TimelineEntry>> fetchPrincipal({
    List<String>? period,
    List<String>? location,
    List<String>? precise,
  }) async {
    try {
      if (period != null) {
        _principal = await client.principal.getPrincipalByPeriod(keywords: period);
      } else if (location != null) {
        _principal = await client.principal.getPrincipalByLocation(keywords: location);
      } else if (precise != null) {
        _principal = await client.principal.getPrincipalByPrecise(keywords: precise);
      }
    }
    catch (e) {print('Error while getting principal');}

知らないって悲しい

でも、一つ一つ発見していく過程は楽しい。
さあ、明日もがんばろう〜\(^O^)/

Flutter大学

Discussion