Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Tomoya Chiba (@tomoasleep) Sorbet やっていき ( たい ) 宣言 1
Slide 2
Slide 2 text
千葉 知也 (@tomoasleep) Qiita 株式会社 エンジニア 勤務地は五反田と自宅です 2022/12 入社 (2 度目) 社内の技術をいい感じにする仕事をしています SNS (?) https://twitter.com/nemunemu3desu https://qiita.com/tomoasleep 自己紹介 2
Slide 3
Slide 3 text
Sorbet に注目している 3
Slide 4
Slide 4 text
https://sorbet.org/ RBS, Steep とはまた別の Ruby 用の静的型付けシステム Gradual Typing が行える Stripe が開発している 型チェッカー自体は C++ で実装されていて高速 Stripe, Shopify などが採用している Sorbet に注目している 4
Slide 5
Slide 5 text
# typed: true extend T::Sig sig { params(a: Integer, b: Integer).returns(Integer) } def sum(a, b) = a + b sum(1, "hoge") # => TypeError Sorbet の DSL を使って型を書く 実行時のアサーションも行える ( 任意) 簡単 Sorbet 入門 (1) - コード中の型の書き方 5
Slide 6
Slide 6 text
# typed: true class Calculator sig { params(a: Integer, b: Integer).returns(Integer) } def sum(a, b); end end .rbi ファイル .rbs, .d.ts みたいな存在 ライブラリやメタプログラミングした型を、書いたり生成したりする 実行時は読まれない 文法自体は Ruby と同じ 簡単 Sorbet 入門 (2) - RBI ファイル 6
Slide 7
Slide 7 text
!! 型で開発を楽にしたい !! 弊社でも試験導入の準備を進めている サービスの一部の機能に限定して Sorbet で型を書こうとしている ( 発表駆動開発… は出来てない ><) が、試しに使ってみて分かってきたこともある 今日はその辺を話す 社内の Rails アプリに導入検討中 7
Slide 8
Slide 8 text
型チェックを行うファイルを限定して、小さく始められる 実行自体は高速 (5 秒かからない程度) Language Server の恩恵を受けられる 型は色々生成してくれる 触っている感触 8
Slide 9
Slide 9 text
# typed: true を書いたファイルのみ型チェックが行われる 特定の機能などに絞って試す、など出来る 型チェックしないファイルも解析は行われている untyped (TypeScript でいう any) 扱いになる 小さく始められる 9
Slide 10
Slide 10 text
# typed: true を書いたファイルのみ型チェックが行われる 特定の機能などに絞って試す、など出来る 型チェックしないファイルも解析は行われている untyped (TypeScript でいう any) 扱いになる 小さく始められる 10
Slide 11
Slide 11 text
Ref: https://sorbet.org/docs/vscode 型エラーを表示してくれる 定数、メソッド、引数の候補を表示してくれる 定数ジャンプが行える untyped が多い初期でも意外と使えて便利 Language Server の恩恵を受けられる 11
Slide 12
Slide 12 text
https://sorbet.org/docs/highlight-untyped untyped の箇所を、エディタ上でハイライト表示してくれる かなり便利 ( 型が付いている場所が一目で分かる) untyped (TypeScript での any) の可視化 12
Slide 13
Slide 13 text
gem の型とかが欲しくなる DSL, メタプロしてるところにも型が欲しくなる Model の型いちいち書くのだるすぎる → Tapioca がいい感じにやってくれる 型を色々生成する仕組み : Tapioca 13
Slide 14
Slide 14 text
https://github.com/Shopify/tapioca Shopify 製の RBI 生成ツール tapioca init でいい感じにセットアップしてくれる 型を色々生成する仕組み : Tapioca 14
Slide 15
Slide 15 text
いわゆる DefinitelyTyped 的な場所から型を取ってきてくれる https://github.com/Shopify/rbi-central Rails でよく使う gem が中心で、まだ数自体は多くない gem のコードや実行時情報を解析して、型を生成することも出来る (!?) どういう定数、method があるかとかを、結構収集してくれる included, class_methods とかも見てる 基本的に untyped になる Tapioca で gem の型を生成する 15
Slide 16
Slide 16 text
https://github.com/tomoasleep/sorbet-rails- sample/blob/main/sorbet/rbi/gems/nokogiri%401.15.4.rbi 生成例 16
Slide 17
Slide 17 text
https://github.com/tomoasleep/sorbet-rails- sample/blob/main/sorbet/rbi/gems/activesupport%407.0.7.2.rbi 生成例 17
Slide 18
Slide 18 text
DSL, メタプロしたコードの型を生成する機構 (DSL compiler) いくつか内蔵してる (Rails 向けなど) 他、自分でも作れる コードを実際に読み込んで解析を行い、型定義 (RBI) を出力する メタプログラミング、DSL に近いところがあるので、この辺慣れてる人 はスッとやれると思う 詳しくは… Tapioca の DSL compiler のしくみ - Qiita DSL などを使うコードの型を生成する : DSL compiler 18
Slide 19
Slide 19 text
https://github.com/tomoasleep/sorbet-rails- sample/blob/main/sorbet/rbi/dsl/user.rbi 生成例 19
Slide 20
Slide 20 text
https://gist.github.com/tomoasleep/85d121751ee0d77fae9d357527e28884 実装例 20
Slide 21
Slide 21 text
https://github.com/AaronC81/sord を使うと生成できる 悩みポイント YARD の型が間違ってる問題 ある程度チェックしたりの選別は必要そう 単一なファイルに出力される 実用上は適当に整形したり分割する必要がありそう YARD から Sorbet の型を生成できる 21
Slide 22
Slide 22 text
型生成 (Tapioca) が偉い 型をある程度生成してくれるので、準備が楽 Language Server の恩恵がデカい 文法に癖はあるが慣れる ( 個人の感想) 微妙に悩ましいこともちょこちょこある delegate が全部 untyped になる 再帰的な type alias が書けない RSpec のテストの型付けにくい メソッド呼び出しに対して Controll Flow 解析が効かない やっている感触 22
Slide 23
Slide 23 text
つづく 23
Slide 24
Slide 24 text
Sorbet を入れたサンプル Rails プロジェクトを用意した https://github.com/tomoasleep/sorbet-rails-sample 時間が余ったら … ( デモ ) 24