Membandingkan 2 Objek di Ruby Menggunakan Comparable

Jika kamu buka program irb yang secara default sepaket dengan instalasi bahasa Ruby, kemudian ketik kode sederhana seperti ini

Output yang didapatkan adalah true.

Tahu kenapa hasilnya true?

String di Ruby dibandingkan dengan mengurutkan secara alfabetis. Karena r huruf depan kata ruby muncul lebih kemudian dari j dari javascript secara alfabetis, otomatis ruby > javascript.

Kalau tidak percaya, sekarang coba ubah jadi

Hasilnya false karena jelas i lebih dulu muncul dari pada y yang artinya i tidak lebih besar dari y.

Memang membingungkan kalau kita tidak tahu objek string dibandingkan berdasarkan apa tapi dari sini kita tahu berarti kalau kita membuat sebuah tipe objek sendiri alias membuat kelas, kita bisa membandingkan objek antar kelas tersebut berdasarkan kriteria yang kita inginkan.

Ambil contoh kita punya kelas Rider dengan propertinya name dan point. Pura-puranya kita membuat aplikasi sistem informasi klasemen moto gp.

Nah namanya klasemen, berarti kita pengen tahu dong, pembalap mana yang posisinya lebih tinggi dari yang satunya? Sampai sini make sense kan ya kenapa kita butuh membandingkan 2 objek, terutama untuk kasus kelas Rider ini.

Misal kita punya objek untuk pembalap Rossi dan Pedrosa dengan masing-masing properti nama dan poinnya.

Sekarang kita bandingkan, apakah rossi posisinya lebih tinggi secara klasemen dari pedrosa. Maka serta merta kita coba membandingkan keduanya menggunakan >.

Hasilnya adalah error

Begitu juga kalau kita gunakan < untuk membandingkan, akan muncul kesalahan lagi.

Terus solusinya gimana?

Nah ini yang ingin saya share sebenarnya dari tadi.

Kita bisa menggunakan mixin Comparable dengan cara melakukan include ke dalam kelas yang ingin dibandingkan kemudian membuat implementasi method bernama <=> dengan kriteria perbandingan yang diinginkan.

Secara internal, method <=> dipakai oleh Ruby untuk perbandingan dan juga pengurutan. Untuk kasus ini yang perlu kita pikirkan adalah cara kita membandingkan antara 2 rider.

Paling masuk akal membandingkan berdasarkan jumlah poin, semakin besar nilai poin berarti semakin besar nilai rider.

Implementasinya jadi seperti ini.

Sekarang kita coba perbandingan yang tadi.

Kali ini berhasil dan didapatkan hasilnya sesuai dengan ekspektasi.

Bonus, tadi saya bilang kalau <=> digunakan juga untuk sorting. Sekarang kita coba

Secara default diurutkan secara ascending. Kalau mau descending berarti perlu dibalik perbandingannya jadi

Perhatikan letak x dan y yang ditukar.

Facebook Comments
 

Agung Setiawan

Agung Setiawan adalah software engineer di BukaLapak.com, penulis sekaligus pecinta sastra, dan pembaca buku

 
Halo, perkenalkan saya Agung Setiawan.
Saya Software Engineer di BukaLapak.
Simak pemikian saya soal dunia Software Engineering via Twitter di @agungsetiawanmu dan facebook
Blog ini saya update seminggu sekali jadi sering-sering saja mampir
Mau belajar Vim bareng saya?
Belajar ngoding dari nol menggunakan PHP

Leave a Reply

Your email address will not be published. Required fields are marked *