Rubyの型定義を実戦投入!`RBS`の導入と運用のポイント
ライフイズテックのサービス開発部 学校プロダクトグループに所属している程です。
大規模なアプリケーションやチーム開発では、型の明示がコードの可読性や保守性を向上させる場合があります。弊社の場合、フロントエンドにおいてはtypescriptで担保していますが、バックエンドはRubyで運用されています。Rubyは動的型付け言語で、型に縛られることなく自由にコードを書けますが、前述の目的でバックエンドにも型定義の仕組みを導入する方向になりました。そこで、Ruby 3.0から導入されたRBS
が役立ちます。今回は、RBS
の導入方法だけでなく、実際の運用の際のポイントも合わせてご紹介します。
RBSの導入
前述の通り、まずはRBS
をプロジェクトに導入しましょう。導入手順は省略しますが、Gemfile
への追加とbundle exec rbs init
で環境が整います。
運用のポイント
1. 段階的な導入
大規模な既存プロジェクトにRBS
を導入する場合、すべてのクラスやメソッドに型定義を一気に追加するのは大変です。重要なクラスや、頻繁に変更が入る部分から型定義を追加するというアプローチをおすすめします。
2. チーム全体でのルール統一
型定義の書き方や適用範囲など、チーム内でのルールを明確にしておくことは非常に重要です。例えば、Optionalな値をどのように扱うか、Genericsの利用方法などを統一感をもって取り組むと、混乱を避けることができます。
3. CIでの型チェック
Steep
やその他のRBS対応ツールをCIに組み込み、自動的に型のチェックを行うことで、型の矛盾や誤りを早期にキャッチすることができます。
4. ドキュメントとの連携
RBS
の型定義は、ドキュメントとしての価値も高いです。実際のメソッドの挙動や引数、戻り値の型をRBSで確認できることで、新しいメンバーや他のチームメンバーがコードを理解しやすくなります。
実際の運用での経験談
私たちのチームでは、RBSを導入して半年が経過しました。初めは、型定義の追加が少し面倒に感じることもありましたが、慣れるとコードのバグを減少させるための強力なツールとして利用できています。
特に、APIのレスポンスや外部ライブラリの戻り値の型を明確にすることで、予期しないエラーを防ぐことができました。
しかし、過度に細かい型定義を求めすぎると、開発のスピードが犠牲になることも。バランス良く型定義を導入していくことが、我々の経験からも重要だと感じています。
まとめ
RBS
を導入することで、Rubyの自由度を維持しつつ、型の安全性も手に入れることができます。適切な運用ルールやチーム内のコミュニケーションを大切にしながら、RBSを最大限活用しましょう!
ライフイズテック サービス開発部では、気軽にご参加いただけるカジュアルなイベントを実施しています。開催予定のイベントは、 connpass のグループからご確認ください。興味のあるイベントがあったらぜひ参加登録をお願いいたします。皆さんのご参加をお待ちしています!
Discussion