Episode ini memperkenalkan type system untuk Ruby: menulis signature RBS dalam file .rbs dan memeriksanya dengan Steep, serta Sorbet dengan gradual typing, sorbet-typed, dan integrasi runtime untuk kode yang lebih andal di production.

Ruby adalah bahasa dynamically typed, tetapi di project besar, typo method atau argumen yang salah baru ketahuan saat runtime. Episode 18 memperkenalkan type system yang bisa dipasang di atas Ruby: RBS dengan type checker statis Steep, dan Sorbet dengan gradual typing.
Kedua pendekatan ini tidak memaksa kalian menulis tipe di semua tempat sekaligus. Kalian memulai dari file atau method kritis, dan checker menyala bertahap. Hasilnya: lebih sedikit bug di production dan dokumentasi jenis yang otomatis terbaca. Kalian memilih satu alat sesuai kebutuhan, bukan kedua-duanya secara bersamaan.
Tipe bukan pengganti test — keduanya menangkap kategori bug yang berbeda. Tipe memeriksa kontrak data secara statis, sementara test memverifikasi perilaku aktual. Gunakan keduanya berdampingan untuk hasil terbaik.
RBS adalah bahasa deskripsi tipe resmi dari tim Ruby. Signature ditulis dalam file .rbs terpisah dari kode — mendeskripsikan method, argumen, dan nilai return:
class Kalkulator
def tambah: (Integer a, Integer b) -> Integer
def bagi: (Integer a, Integer b) -> Float | nil
attr_accessor nama: String
enddef tambah: (Integer a, Integer b) -> Integer menyatakan method tambah menerima dua Integer dan mengembalikan Integer. Float | nil menandakan union type — method bisa mengembalikan Float atau nil. RBS juga mendukung generic, interface, dan untyped untuk sementara. File signature umumnya diletakkan di direktori sig/ dengan struktur mengikuti kelasnya.
Signature tidak harus ditulis sendiri. Banyak gem menyediakan file .rbs di dalam paketnya, dan rbs collection membantu mengumpulkan semuanya dalam satu tempat:
rbs collection init
rbs collection installrbs collection init membuat file konfigurasi collection, lalu rbs collection install mengunduh signature gem yang tersedia. Dengan ini, type checker memahami kode pihak ketiga tanpa kalian mengetik ulang ribuan baris signature.
Untuk mempercepat penulisan, rbs prototype rb bisa menghasilkan signature awal dari kode Ruby yang sudah ada, dan rbs validate memeriksa kebenaran syntax file signature. Dua perintah ini sangat membantu saat mengadopsi RBS di codebase yang sudah berjalan.
Steep memeriksa kode terhadap signature RBS tanpa menjalankan program. Pasang dan jalankan dari terminal:
gem install steep
steep init
steep checksteep check membaca signature di sig/ lalu melaporkan ketidakcocokan: argumen salah tipe, return yang tidak sesuai kontrak, atau pemanggilan method yang tidak ada. Konfigurasi checker diatur lewat Steepfile — tentukan path kode, path signature, dan library yang dipakai. Jalankan Steep di CI agar regresi tipe terdeteksi sebelum merusak production.
Steep juga bekerja di editor lewat Language Server Protocol. Dengan setup ini, feedback tipe muncul langsung ketika kalian mengetik, bukan menunggu hasil checker di terminal. Kombinasi editor dan CI membuat tipe menjadi bagian alami dari alur kerja.
Sorbet dari Stripe bekerja berbeda: tipe ditulis langsung di dalam file Ruby lewat comment sigil di baris pertama dan annotation:
# typed: true
class Kalkulator
extend T::Sig
sig { params(a: Integer, b: Integer).returns(Integer) }
def tambah(a, b)
a + b
end
end# typed: true mengaktifkan pemeriksaan tipe pada file tersebut. sig { params(...).returns(...) } mendeklarasikan kontrak method. Sorbet juga mendukung tingkat strict dan strong untuk file yang sudah sepenuhnya di-type, sehingga adopsi bisa bertahap file demi file tanpa mengubah seluruh codebase sekaligus.
Tingkat strict mewajibkan semua method memiliki signature, sedangkan strong memperketat kontrol tipe secara menyeluruh. Tim biasanya menaikkan tingkat secara bertahap seiring kode dianotasi, dimulai dari false, lalu true, strict, dan akhirnya strong.
Sorbet menyediakan repository sorbet-typed berisi signature untuk gem populer, sehingga checker bisa memahami kode pihak ketiga. Sorbet juga berjalan saat runtime: bila signature dilanggar di production, exception dilempar sesuai kebijakan. Siapkan project dengan perintah-perintah berikut:
bundle add sorbet sorbet-runtime
srb init
srb rbi sorbet-typed
srb tcsrb init membuat skeleton konfigurasi dan file RBI. srb rbi sorbet-typed mengimpor signature dari repository sorbet-typed, sedangkan srb tc menjalankan type checking. Untuk runtime, library sudah tersedia sebagai sorbet-runtime. Sorbet memberi kompromi menarik: ketelitian tipe ketika kalian membutuhkannya, tanpa mengubah Ruby itu sendiri.
Tip
Pilih alat sesuai kebutuhan: RBS adalah standar resmi dan semakin banyak gem menyediakan signature-nya; Sorbet unggul untuk adopsi bertahap di codebase besar dengan runtime checking bawaan.
Inti yang harus dibawa pulang:
.rbs terpisah.def nama: (Tipe a) -> Tipe mendeklarasikan argumen dan return.rbs collection install mengumpulkan signature gem otomatis.# typed: dan annotation sig.sorbet-typed membawa signature gem populer ke checker.Di episode 19 kita membuka pintu tersembunyi Ruby: metaprogramming dengan send, define_method, method_missing, dan class_eval untuk membuat DSL, lalu memahami singleton class serta method lookup chain. Setelah tipe aman, kita pelajari keajaiban dinamisme Ruby.