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
haco
December 25, 2020
0
2.1k
コードファースト 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
790
新タクシー配車システムの裏側/dispatcher-background
haco
1
420
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
95
5.2k
Gamification - CAS2011
davidbonilla
80
5.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
How To Stay Up To Date on Web Technology
chriscoyier
789
250k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Designing for Performance
lara
604
68k
Making the Leap to Tech Lead
cromwellryan
133
9k
Optimizing for Happiness
mojombo
376
70k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
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 ではコードファーストが⭕ ただし… ▪
(オフレコで…) 結論