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