Metode predicate

Konvensi metode bertanda tanya (?), tanda seru (!), dan gaya penamaan metode Ruby.

Daftar isi

Metode predicate adalah metode yang menguji sebuah kondisi dan mengembalikan true atau false. Ruby memiliki dua konvensi penamaan khusus untuk keluarga metode ini, yaitu akhiran tanda tanya untuk metode predicate dan akhiran tanda seru untuk pasangan metode yang berperilaku lebih berisiko. Topik ini membahas kedua konvensi tersebut beserta gaya penamaan metode Ruby secara umum.

Tanda tanya untuk metode predicate#

Metode yang berakhir tanda tanya disebut metode predicate, yaitu metode yang mengajukan pertanyaan berjawaban benar atau salah tentang objek yang diujinya. Pustaka standar Ruby penuh dengan metode semacam ini, misalnya nil? pada objek, empty? pada string, serta even? dan odd? pada bilangan bulat. Tanda tanya tersebut termasuk bagian dari nama metode, sehingga definisi dan pemanggilannya sama-sama wajib menuliskannya. Metode predicate yang ditulis sendiri mengikuti pola yang sama, yaitu isinya mengevaluasi sebuah kondisi dan baris terakhirnya menghasilkan true atau false.

ruby predikat_nilai.rb
# Metode predicate untuk nilai ujian

def lulus?(nilai)
  nilai >= 75
end

def perlu_remedial?(nilai)
  !lulus?(nilai)
end

p lulus?(80)
p lulus?(60)
p perlu_remedial?(60)
text Keluaran
true
false
true

Hasil perbandingan nilai >= 75 berada di baris terakhir metode, sehingga menjadi nilai kembaliannya tanpa perlu return. Metode perlu_remedial? menunjukkan bahwa predicate boleh memanggil predicate lain, dan tanda seru di awal ekspresi merupakan negasi logika, bukan bagian dari nama metode. Nama kedua metode terbaca seperti kalimat tanya pada titik pemanggilannya, misalnya if perlu_remedial?(nilai) langsung menyampaikan maksudnya kepada pembaca kode.

Potongan berikut memanggil beberapa predicate pustaka standar agar bentuk kembaliannya terlihat langsung.

ruby Metode predicate pada pustaka standar
p 10.even?
p 7.even?
p "abc".empty?
p nil.nil?
text Keluaran
true
false
false
true

Tanda seru untuk metode berisiko#

Akhiran tanda seru menandai pasangan metode yang berperilaku lebih berisiko daripada versi tanpa tanda serunya. Pasangan paling terkenal adalah chomp dan chomp! pada string. Pada pasangan ini, versi bertanda seru mengubah objek aslinya secara langsung alih-alih mengembalikan salinan baru. Dokumentasi resmi Ruby menegaskan bahwa kedua akhiran ini murni konvensi, yaitu Ruby tidak memaksakan aturan apa pun di baliknya, sehingga maknanya ditentukan oleh penulis metode.

Program berikut membandingkan keduanya. Metode chomp mengembalikan string baru tanpa baris baru di ujungnya dan membiarkan string aslinya utuh, sedangkan chomp! mengubah string yang sama secara langsung.

ruby Perbandingan chomp dan chomp!
teks = "suhu: 27C\n"

p teks.chomp
p teks
teks.chomp!
p teks
text Keluaran
"suhu: 27C"
"suhu: 27C\n"
"suhu: 27C"

Baris kedua keluaran memperlihatkan teks masih memuat \n setelah chomp dipanggil, sedangkan baris ketiga memperlihatkan teks sudah berubah setelah chomp! dieksekusi. Karena kerusakan akibat mutasi tidak mudah dibatalkan, kebiasaan yang dianjurkan adalah menggunakan versi tanpa tanda seru terlebih dahulu, dan versi bertanda seru disimpan untuk keadaan yang memang memerlukan mutasi.

Gaya penamaan metode Ruby#

Di luar kedua akhiran khusus, penamaan metode Ruby mengikuti konvensi umum bahasa ini, yaitu huruf kecil dengan garis bawah sebagai pemisah kata. Dokumentasi resmi menyebutkan bahwa nama metode boleh berisi huruf, angka, dan garis bawah, serta boleh diakhiri tanda tanya, tanda seru, atau tanda sama dengan. Akhiran tanda sama dengan digunakan untuk metode penugasan yang dipanggil seperti pengisian nilai variabel, dan penggunaannya paling relevan pada definisi kelas.

Nama metode sebaiknya menyatakan tindakan atau pertanyaan dengan kata kerja yang tepat, misalnya konversi_meter, hitung_luas, lulus?, dan valid?. Gaya hitungLuas yang populer di bahasa lain sah secara sintaks, tetapi bertentangan dengan konvensi Ruby dan membuat kode terlihat asing. Konsistensi penamaan membuat kode terbaca seragam, sehingga pembaca dapat memperkirakan perilaku sebuah metode hanya dari namanya. Prediksi semacam ini sangat berguna pada proyek yang dikerjakan banyak orang, karena pembacaan kode jauh lebih sering dilakukan daripada penulisannya.

Kesalahan umum#

Kesalahan pertama adalah menulis predicate yang tidak mengembalikan true atau false. Ruby menganggap nilai apa pun selain false dan nil sebagai benar, sehingga metode bertanda tanya yang mengembalikan angka atau string tetap berfungsi di dalam if. Meskipun demikian, pembaca kode akan mengharapkan jawaban boolean dari tanda tanya tersebut, dan nilai selain true atau false bisa terbawa keluar metode, misalnya tercetak atau tersimpan ke variabel. Perbaikannya, pastikan baris terakhir predicate benar-benar menghasilkan true atau false, misalnya dengan perbandingan atau metode pemeriksaan yang mengembalikan boolean.

Kesalahan kedua adalah keliru membedakan tanda seru di awal pemanggilan dan tanda seru di akhir nama metode. Tanda seru di depan sebuah pemanggilan berarti negasi, yaitu membalik kebenaran hasilnya, sedangkan tanda seru di akhir nama adalah bagian dari nama metode itu sendiri. Keduanya mudah dibedakan dari posisinya, yaitu !lulus?(60) membalik hasil lulus?, sedangkan teks.chomp! memanggil metode bernama chomp!. Keliru membaca posisi ini menghasilkan logika yang berlawanan dengan maksud penulisnya.

Ringkasan#

  • Metode bertanda tanya adalah predicate, yaitu metode yang mengembalikan true atau false atas sebuah kondisi.
  • Tanda seru menandai pasangan metode yang lebih berisiko, biasanya karena mengubah objek aslinya.
  • Kedua akhiran murni konvensi penamaan dan tidak ditegakkan oleh Ruby secara otomatis.
  • Nama metode ditulis dengan snake_case, dan predicate sebaiknya benar-benar mengembalikan nilai boolean.

Referensi#