Saya baru-baru ini membaca buku Crockford "Javascript: The Good Parts" dan salah satu dasar yang mendasari adalah bahwa bahasa pemrograman dapat memiliki set fitur yang buruk yang harus dihindari oleh programmer.
Saya seorang Rubyist dan sementara saya suka bahasa selalu ada nilai dalam mendapatkan perspektif. Jadi, apa yang Anda lihat sebagai fitur terburuk (misalnya metode, kelas, praktik) di Ruby? Maksud saya di sini bukan untuk memulai argumen tentang manfaat bahasa itu sendiri atau kecepatannya dan sebagainya. Sebaliknya saya lebih suka diskusi tentang fitur apa yang Anda anggap berbahaya / merepotkan / menyakitkan untuk digunakan, berdasarkan pengalaman masa lalu.
Jawaban:
Anda harus menonton Python vs Ruby: A Battle to The Death oleh Gary Bernhardt. Dia membuat kutipan:
Sementara dia berbicara banyak tentang Python secara khusus, dia menyentuh banyak hal yang aneh di Ruby. Salah satu subjek besar yang memayungi adalah tambalan monyet .
Walaupun ini memberikan banyak fleksibilitas dan kekuatan beberapa permata Ruby yang paling populer dan rumit, itu dapat menggigit Anda di pantat jika Anda mencoba men-debug masalah tanpa menyadari bahwa beberapa perpustakaan di suatu tempat telah memodifikasi metode inti.
sumber
Beberapa orang hanya memikirkan ruby dalam hal ruby pada rel dan itu agak menjengkelkan karena bahasanya berdiri sendiri.
sumber
Saya pikir fitur terburuk adalah
open classes
yang memungkinkan Anda untuk mengubah perilaku semua instance kelas saat ini dan di masa depan secara global.Bagian bermasalah dari fitur ini adalah, bahwa perubahan tesis (global) ini terjadi selama runtime ketika penerjemah Ruby menemukan definisi, yang mungkin lama setelah Anda sudah instantiated beberapa objek yang sekarang mengubah perilaku mereka tiba-tiba.
Dalam basis kode besar ini dapat mengakibatkan bug yang sangat, sangat sulit ditemukan - terutama karena ini diperparah oleh kelemahan Ruby (dibandingkan dengan contohnya dengan CLR atau JVM) men-debug cerita dan penggunaan fitur-fitur lain (misalnya
eval
) dalam konteks ini dapat membuat cukup sulit untuk menemukan lokasi di mana perubahan global ini terjadi. yaitu jika Anda sudah mencapai titik di mana Anda mencurigai kelas 'benar' menyebabkan masalah! Dalam pengalaman saya, Anda biasanya memulai dengan pengejaran angsa liar, karena masalah mulai muncul pada suatu objek menggunakan pelakunya yang sebenarnya.Jadi yang terbaik adalah berhenti menggunakan kelas terbuka (
#extend
dan menempatkan perubahan padaModule
IMHO jauh lebih aman, lebih mudah dimengerti dan lebih baik untuk diuji) atau jika tidak dapat dihindari untuk:#eval
dan teman-teman untuk membuat kelas terbukasumber
Alasan terbesar saya tidak menggunakan Ruby: Ini lebih lambat dari molase pada bulan Januari di Kutub Utara selama zaman es. Bahasa pembandingan adalah ilmu yang tidak eksak, tetapi Ruby tampak lebih lambat secara drastis daripada JavaScript dan Python.
sumber
Jika ini dapat diperluas ke Ruby on Rails, maka:
Fakta bahwa logika database memberi setiap tabel
auto_increment
kunci utama, termasuk tabel yang tidak membutuhkannya dan tidak boleh memilikinya.Fakta bahwa kunci majemuk tidak didukung sama sekali.
Untuk Ruby biasa, keluhan saya akan sama dengan bahasa apa pun yang memperdagangkan keselamatan untuk ekspresif; mudah untuk melakukan banyak hal hanya dengan sedikit kode, tetapi juga sangat mudah untuk membuat kekacauan besar dengan jumlah kode apa pun.
sumber
auto_increment
id, terutama bergabung dengan tabel untuk has_and_belongs_to_many hubungan disarankan secara eksplisit TIDAK memiliki kolom id.Ruby mencakup metaprogramming (refleksi, introspeksi), pemrograman multi-paradigma, dan dinamika pada tingkat yang tidak biasa. Mudah menembak diri sendiri di kaki dengan kekuatan dan fleksibilitas.
Sulit? Ruby memiliki kemampuan untuk menjadi sangat mudah dibaca atau tidak rusak. Saya telah melihat kode yang sepertinya milik skrip Bash.
Praktik Buruk? Beberapa Rubyist menghargai kepintaran daripada kebijaksanaan. Mereka menulis dan berbagi trik yang menunjukkan kepintaran mereka, tetapi ini menciptakan kode yang tidak dapat dibaca dan rapuh.
Sebagai tambahan: Javascript adalah bencana karena desain, dan buku "The Good Parts" mencoba mengekstrak keindahan tersembunyi itu. Perl, sebuah bahasa yang mempopulerkan "Ada Lebih Dari Satu Cara Untuk Melakukannya" (yaitu, fleksibilitas), memiliki buku serupa dalam "Perl, Best Practices". Sejarah Perl adalah salah satu eksperimen dan pengalaman yang sulit didapat, "Praktik Terbaik" mewakili pengetahuannya. Perl 6 akan, saya pikir itu adil untuk mengatakan, reboot bahasa berdasarkan pengetahuan itu dan banyak lagi. Ruby mungkin menderita masalah serupa.
@James dan untuk loop ... Ketika Anda melakukan loop for di ruby, itu kemudian memanggil ".each". Oleh karena itu, "untuk" adalah gula sintaksis untuk orang yang lebih nyaman dengan loop gaya C. Tetapi sebagai seorang Rubyist, Anda akan menggunakan iterator seperti .map, .inject, .each_with_object, sepanjang waktu. Anda tidak perlu menulis for for loop dengan sesuatu seperti "i = 0; i> 6; i ++" di ruby, dan akhirnya Anda menghentikan kebiasaan itu. @ andrew ... rubi fasih tidak mendukung loop.
sumber
Ini lebih tentang programmer daripada bahasa, tetapi mengapa programmer Ruby sangat membenci loop?
Saya menyadari Ruby memiliki:
tapi saya belum pernah melihat itu digunakan dalam situasi di mana for for loop tidak akan melakukan hal yang persis sama.
Saya sudah bertanya beberapa kali dan tidak pernah mendapat jawaban yang bagus untuk yang satu ini.
Jika ini hanya masalah gaya, saya senang menerimanya, tetapi saya telah melihat programmer Ruby benar-benar memahami hal ini dan saya benar-benar ingin tahu.
sumber
for
loop adalah sesuatu yang dilakukan n00bs. Orang yang memprogram C di Ruby. 2) Blok banyak digunakan di Ruby, jadi menggunakan sesuatu yang tidak seperti blok hanyalah upaya mental ekstra.Saya biasanya menghindari hal-hal yang ditambahkan hanya agar kompatibel dengan bahasa lain. Sebagai contoh, Perlisms dan
for x in y
.sumber