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
940
新タクシー配車システムの裏側/dispatcher-background
haco
1
430
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.3k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.5k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
350
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
The browser strikes back
jonoalderson
0
360
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.6k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
120
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.2k
Context Engineering - Making Every Token Count
addyosmani
9
650
Testing 201, or: Great Expectations
jmmastey
46
8k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
49k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.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 ではコードファーストが⭕ ただし… ▪
(オフレコで…) 結論