型を書かないRuby開発への挑戦
by
Shia
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
福岡Rubyist会議05 Shia@STORES 型を書かないRuby開発への挑戦
Slide 2
Slide 2 text
SIM SANGYONG (@shia) - STORES株式会社 - GitHub: @riseshia - X: @riseshia 自己紹介 2
Slide 3
Slide 3 text
質問です 3 Rubyで型を書きたいですか?
Slide 4
Slide 4 text
お気持ち 4 型を書きたくない!!
Slide 5
Slide 5 text
正確なお気持ち 5 Ruby では型を書きたくない!!
Slide 6
Slide 6 text
そしてただのワガママ 6 Ruby では型を書きたくない!! でも型情報はちょっとほしい
Slide 7
Slide 7 text
Ruby 型マップ 7 型宣言依存度 Steep / Sorbet Ruby LSP Guessed type typeprof solargraph 提供される情報の品質
Slide 8
Slide 8 text
Ruby 型マップ 8 型宣言依存度 Steep / Sorbet Ruby LSP Guessed type typeprof solargraph 型宣言が前提。方向が違う 提供される情報の品質
Slide 9
Slide 9 text
Ruby 型マップ 9 型宣言依存度 Steep / Sorbet Ruby LSP Guessed type typeprof solargraph 丁寧な推論 大規模アプリだと少々重い gem は rbs 書いてね 提供される情報の品質
Slide 10
Slide 10 text
Ruby 型マップ 10 型宣言依存度 Ruby LSP Guessed type typeprof solargraph 欲しいアプローチは近いが Hash/Array が情報不足 あと ruby-lsp と機能重複... Steep / Sorbet 提供される情報の品質
Slide 11
Slide 11 text
Ruby 型マップ 11 型宣言依存度 Ruby LSP Guessed type typeprof solargraph 変数名ベースの単純推測のみ 提供される情報の品質 Steep / Sorbet
Slide 12
Slide 12 text
Ruby 型マップ 12 型宣言依存度 Ruby LSP Guessed type typeprof solargraph この辺の何かがほしい 提供される情報の品質 Steep / Sorbet
Slide 13
Slide 13 text
推論の精度を落とし 自分が書く型の必要性を減らす・速度を得る 欲しいもの 13
Slide 14
Slide 14 text
- 推論された型が複雑なら untyped に - A or B or C or D… -> untyped でいいでしょう! - Hash / Array に Structural Typing サポート - ヒューリスティックに依存する どうやって? 14
Slide 15
Slide 15 text
Structural Typing - Hash 15
Slide 16
Slide 16 text
Structural Typing - Array 16
Slide 17
Slide 17 text
Duck Typing を信じる 17 通常の Duck Typing: 「これらのメソッドに応答できるなら、OK」 🦆 quack できるなら → アヒル type-guessr: 「これらのメソッドが呼ばれたなら、このクラスのはず」 🦆 quack が呼ばれた → きっとアヒル
Slide 18
Slide 18 text
Duck Typing を信じる 18
Slide 19
Slide 19 text
Duck Typing を信じる 19
Slide 20
Slide 20 text
Duck Typing を信じる 20
Slide 21
Slide 21 text
対象: LOC 100k 以上の Rails プロジェクト三つ 変数に送ったメソッド一覧から、変数(レシーバ)の型がわかる比率 => 10~20% Duck Typing を信じる - そんな〜うまくいくんですか? 21
Slide 22
Slide 22 text
Duck Typing を信じる in type-guessr 22
Slide 23
Slide 23 text
- ruby-lsp の UX にそのまま溶け込める - 適切に実装すれば hover, autocompletion, 定義ジャンプが「型 がわかれば」自動で効く - ruby-lsp-rails, ruby-lsp-mongoid 等が ruby-lsp に登録する DSL 由来のメソッド一覧をそのまま活用できる - Duck typing ヒューリスティックではめっちゃ大事 設計 - Impl as ruby-lsp add on 23
Slide 24
Slide 24 text
設計 - How to infer - Duck typing によるクラス推定を頑張る - 自明なものを頑張る(e.g. Hoge.new) - あとは型情報を使って伝播していく - 型推論の結果が一定以上複雑になったら精度を落とす 24
Slide 25
Slide 25 text
- 十分小さいアプリでは価値が出にくい (メソッド名の一意性に依存) - ActiveRecord とかが大変扱いづらい... - 速度が遅い問題 - ruby-lsp のインデッシングを待つ必要がある - 推論が重い - Diagnostic 出しづらい問題 - ヒューリスティックを混ぜたことでどう出すべきかという悩み Limitation 25
Slide 26
Slide 26 text
今色々いじりまくっており unstable ですが どうぞお試しください (そしてフィードバックがあると喜びます) bundle add type-gusser -g=’development’ https://github.com/riseshia/type-guessr 最後に 26