Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コードファースト vs スキーマファースト on Rust / code-first-vs-s...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
haco
December 25, 2020
0
2.4k
コードファースト vs スキーマファースト on Rust / code-first-vs-schema-first
haco
December 25, 2020
Tweet
Share
More Decks by haco
See All by haco
crates.io にライブラリを公開してみた / publish-on-crates-io
haco
0
950
新タクシー配車システムの裏側/dispatcher-background
haco
1
430
Featured
See All Featured
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
Unsuck your backbone
ammeep
671
58k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
220
Darren the Foodie - Storyboard
khoart
PRO
2
2.4k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
65
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
410
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
How STYLIGHT went responsive
nonsquared
100
6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Mobile First: as difficult as doing things right
swwweet
225
10k
Marketing to machines
jonoalderson
1
4.6k
Transcript
Mobility Technologies Co., Ltd. GraphQL ライブラリの Juniper を調べていたらコード ファーストとスキーマファーストについて語りたくなった t.aida
2020-12-17 MoT.rs #3
Mobility Technologies Co., Ltd. 2 おさらい : GraphQL のスキーマはこんなやつ type
Film { id: Int title: String! } SDL と呼ばれる専用の文法 ▪ Schema Definition Language の略 ▪ なので SDL-first とも呼ばれてる (インターフェース定義言語 IDL の一つ) スキーマファーストって何さ
Mobility Technologies Co., Ltd. 3 一通りの型を表現できるようになってる type Film { id:
Int title: String! director: Person! actors(limit: Int = 10): [Person] } type Person { id: Int name: String! } このスキーマからコードを生成するのがスキーマファースト スキーマファーストって何さ
Mobility Technologies Co., Ltd. 4 スキーマファーストの逆。 こんな感じの Rust のコードから… #[derive(GraphQLObject)]
struct Person { name: String, age: i32, } 直接 GraphQL サーバを作る コードファーストって何さ
Mobility Technologies Co., Ltd. 5 Rust なのでいろいろ柔軟に書ける #[graphql_interface(for = [Human,
Droid])] trait Character { fn id(&self) -> &str; } #[graphql_interface] impl Character for Human { fn id(&self) -> &str { &self.id } } これは trait と impl に GraphQL の i/f をマッピングしている例 コードファーストって何さ
Mobility Technologies Co., Ltd. 6 Juniper には色々おもしろい attributes etc があるんですが
今回の LT では触れません!残念! こんな感じで
Mobility Technologies Co., Ltd. 7 コードファーストとスキーマファーストって 一般にどちらがいいのだろう あらすじ ▪ スキーマファーストの
Pros & Cons ▪ コードファーストの Pros & Cons ▪ 私の見解 発端 : Juniper 公式ドキュメントから Quickstart - Juniper - GraphQL Server for Rust (Juniper はコードファースト推し) 本題
Mobility Technologies Co., Ltd. 8 Pros ▪ スキーマをフロントエンドとバックエンド共通の所有物にできる (API 定義の場合)
▪ 定義が独立するのでテストが進めやすい ▪ ▪ 特定のウェブフレームワーク (Rails とか) に依存しないで済む (テーブル定義の場合) ▪ 実装言語に縛られない ▪ Cons ▪ IDL の貧弱な文法に制限される ▪ 必ずしも最適なコードを生成できない ▪ IDL とそれぞれの言語は普通は 1:1 で対応しない ▪ スキーマのバージョン管理が煩雑 ▪ バックエンドとフロントエンドがそれぞれ 依存しているバージョンを管理するためには別途工夫が必要 スキーマファースト
Mobility Technologies Co., Ltd. 9 Pros ▪ コードが常にスキーマと一致する ▪ コードの生成タイミングなどを気にする必要なし
▪ モジュール単位でファイルを分割できる ▪ ファイル巨大化は GraphQL も JSON Schema も抱える問題点 ▪ コードの重複を回避できる ▪ IDL 側の表現力が貧弱なことに起因 ▪ (generics, trait, mix-in etc の不在による) ▪ IDE のサポートが強力 ▪ 型の検査や補完など Cons ▪ 実装言語に縛られる ▪ ▪ スキーマがバックエンドの所有物になってしまう コードファースト
Mobility Technologies Co., Ltd. 10 特に悩ましいポイント ▪ スキーマファースト Pros ▪
スキーマをフロントエンドとバックエンド共通の所有物にできる ▪ コードファースト Cons ▪ スキーマがバックエンドの所有物になってしまう 本来の理想は… ▪ API はフロントエンドのものでもバックエンドのものでもない ▪ i/f を決めるのがどちらか一方であってはいけない しかし現実の多くのケースは… ▪ (ここはオフレコでしゃべるだけで…) 解決するためには… ▪ (ここもオフレコで…) 私の見解
Mobility Technologies Co., Ltd. 11 表現力の豊かな Rust ではコードファーストが⭕ ただし… ▪
(オフレコで…) 結論