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
2.4k
0
Share
コードファースト vs スキーマファースト on Rust / code-first-vs-schema-first
haco
December 25, 2020
More Decks by haco
See All by haco
crates.io にライブラリを公開してみた / publish-on-crates-io
haco
0
980
新タクシー配車システムの裏側/dispatcher-background
haco
1
440
Featured
See All Featured
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.3k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.2k
Leo the Paperboy
mayatellez
7
1.8k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Abbi's Birthday
coloredviolet
2
7.8k
Speed Design
sergeychernyshev
33
1.7k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
370
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
370
Between Models and Reality
mayunak
4
310
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
710
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 ではコードファーストが⭕ ただし… ▪
(オフレコで…) 結論