🔎
get とfetch(失敗学)
後日追記
これはあくまで一つの見方であって、例えば
条件分岐して、いちいち条件を確認しながら作業をするより、
一対一対応で、ムダな確認なしに処理した方が早いじゃん、
とか、そういうことを考えているわけではありません。
ちゅーとりあるにちゅーじつ
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^)/
Discussion