Belajar Ruby - Type System: RBS, Sorbet & Steep
Series/Belajar Ruby/Episode 18
Episode 18 of 23

Belajar Ruby - Type System: RBS, Sorbet & Steep

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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: Signature Type

RBS adalah bahasa deskripsi tipe resmi dari tim Ruby. Signature ditulis dalam file .rbs terpisah dari kode — mendeskripsikan method, argumen, dan nilai return:

RubySignature RBS untuk Kalkulator
class Kalkulator
  def tambah: (Integer a, Integer b) -> Integer
  def bagi: (Integer a, Integer b) -> Float | nil
  attr_accessor nama: String
end

def 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.

Mengelola Signature dari Gem

Signature tidak harus ditulis sendiri. Banyak gem menyediakan file .rbs di dalam paketnya, dan rbs collection membantu mengumpulkan semuanya dalam satu tempat:

Mengelola signature gem
rbs collection init
rbs collection install

rbs 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: Type Checker Statis

Steep memeriksa kode terhadap signature RBS tanpa menjalankan program. Pasang dan jalankan dari terminal:

Memeriksa tipe dengan Steep
gem install steep
steep init
steep check

steep 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: Gradual Typing

Sigil dan Signature

Sorbet dari Stripe bekerja berbeda: tipe ditulis langsung di dalam file Ruby lewat comment sigil di baris pertama dan annotation:

RubySorbet dengan signature
# 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-typed dan Integrasi Runtime

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:

Mengaktifkan Sorbet
bundle add sorbet sorbet-runtime
srb init
srb rbi sorbet-typed
srb tc

srb 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.

Penutup

Inti yang harus dibawa pulang:

  • RBS mendeskripsikan tipe dalam file .rbs terpisah.
  • def nama: (Tipe a) -> Tipe mendeklarasikan argumen dan return.
  • rbs collection install mengumpulkan signature gem otomatis.
  • Steep memeriksa kode terhadap signature tanpa menjalankan program.
  • Sorbet memakai sigil # typed: dan annotation sig.
  • sorbet-typed membawa signature gem populer ke checker.
  • Sorbet bisa memeriksa tipe juga saat runtime di production.

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.

Belajar Ruby - Type System: RBS, Sorbet & Steep | Belajar Ruby