JRuby on Rails: Kekuatan Java, kesederhanaan Ruby on Rails

Ruby, bahasa dinamik (skrip) berorientasikan objek yang lengkap, dengan sokongan kuat untuk pengaturcaraan fungsional dan pemrograman metaprogram, menarik perhatian baru-baru ini kerana fleksibiliti dan kemudahan pengembangannya. JRuby, jurubahasa berasaskan JVM untuk Ruby, menggabungkan kemudahan bahasa Ruby dengan pelaksanaan dalam JVM yang kuat, termasuk integrasi penuh ke dan dari perpustakaan Java.

Sejak artikel JavaWorld saya sebelumnya mengenai topik ("JRuby for the Java World"), ada beberapa perkembangan menarik untuk JRuby. Sun Microsystems mengupah dua pembangun utama JRuby, Charles Nutter dan Thomas E. Enebo, sebagai tanda sokongan untuk Ruby di JVM. Platform Java, Edisi Standard 6 (Java SE 6) diluncurkan dengan API standard baru untuk memasukkan juru bahasa untuk bahasa dinamik. Rancangan semakin meningkat untuk Java 7 VM untuk menyokong bahasa dinamik secara langsung dengan bytecode "invoke dynamic" baru dan pertukaran definisi kelas yang panas pada waktu runtime. Sementara itu, pasukan JRuby telah merilis versi 0.9.2 dengan sokongan yang lebih luas untuk Ruby on Rails, dan rilis besar JRuby berikutnya, yang diharapkan pada bulan Februari, akan merangkumi sokongan penuh untuk Ruby on Rails.

Ruby on Rails, kerangka Web yang mudah digunakan tetapi kuat yang dibina berdasarkan bahasa Ruby, dengan cepat mendapat populariti untuk aplikasi Web yang disokong pangkalan data baru, terutama di dunia Web 2.0. Saya akan merujuk anda ke tempat lain untuk perincian Ruby on Rails, juga disebut Rails. Walaupun projek ini baru berusia 3 tahun, banyak artikel dan buku telah ditulis mengenainya, dan dokumentasinya sangat baik untuk projek sumber terbuka (lihat laman web Ruby on Rails). Begitu juga, saya merujuk anda pada artikel saya yang terdahulu untuk pengenalan kepada JRuby.

Dalam artikel ini, saya mengkaji persimpangan antara Rails dan Java. Saya membandingkan kerangka kerja Rails dan Java Web, menerangkan faedah menjalankan Rails dengan JRuby, dan mengulas beberapa pelajaran yang dapat dipelajari oleh pemaju Java - bahkan yang tidak menggunakan Rails - dari kerangka inovatif ini.

Kekuatan dan kesederhanaan

Rel secara radikal mempercepat dan mempermudah pengembangan aplikasi Web, tetapi mengalami gambaran yang tidak matang, terutama dalam kemampuan kekuatan perusahaan kelas atas.

Sebaliknya, platform Java, dengan mesin maya, perpustakaan dan pelayan aplikasi, telah memperoleh kepantasan, kestabilan dan fungsi, sehingga secara umum dianggap sebagai platform utama untuk aplikasi pelayan kelas atas. Namun selagi tetap terikat dengan bahasa Java, platform Java berisiko ketinggalan ketika bahasa yang lebih baru mendapat popularitas.

JRuby menghubungkan kekuatan pelengkap dari semua teknologi ini, menjanjikan populariti tambahan untuk Ruby dan Rails, sambil memberikan platform Java peranan baru dalam menjalankan bahasa non-Java.

Rel: Tempat kerangka Java menuju

Bagi pemaju Java, Rails sepertinya merupakan puncak semula jadi tren dalam evolusi kerangka Web Java: kurang kod yang tidak perlu, lebih banyak abstraksi dan dinamisme, dan fungsi yang lebih lengkap.

Konvensyen mengenai konfigurasi

Versi awal Java Platform, Enterprise Edition (Java EE) memerlukan konfigurasi dan kod yang luas untuk setiap komponen. Enterprise JavaBeans, misalnya, mempunyai banyak fail konfigurasi sumber-sumber dan XML untuk setiap kacang. Kerumitan ini menjadikan EJB menjadi kata kunci untuk pengembangan kelas berat, dan akhirnya menyebabkan putaran 180 darjah EJB 3, yang bertujuan untuk kacang POJO (objek Java biasa) dengan redundansi dan konfigurasi minimum. Meski begitu, aplikasi Java EE kelas berat masih memerlukan pemaju untuk mengembangkan kod untuk mengekspresikan objek perniagaan yang sama di pelbagai peringkat perisian - GUI, logik perniagaan dan kegigihan. Kemudian, walaupun terdapat kelebihan dan persamaan antara lapisan, pembangun mesti merekatkan lapisan tersebut dengan fail konfigurasi. Berbeza,Kerangka Web Java yang lebih baru Seam and Spring memaparkan objek perniagaan dengan lebih banyak konfigurasi dan kod.

Kerangka kerja Java juga bergerak menuju standardisasi dan integrasi tumpukan di seluruh tingkatan aplikasi Web. Pada hari-hari terawal, pembangun aplikasi Web Java menggunakan kod HTML output dari servlet, membuat arsitektur Model-View-Controller mereka sendiri, dan mengakses pangkalan data mereka dengan SQL melalui Java Database Connectivity (JDBC). Kemudian, mereka mengumpulkan komponen untuk melaksanakan banyak fungsi umum, seperti perpustakaan tag, Struts dan Hibernate. Baru-baru ini, Spring menggabungkan banyak fungsi dalam satu timbunan ringan dari atas ke bawah.

Sejak awal, Rails telah menerapkan prinsip-prinsip kesederhanaan ini, prinsip-prinsip yang diketahui oleh masyarakat Rails sebagai "Jangan Ulangi Diri Anda" dan "Konvensyen mengenai Konfigurasi." (Lalai yang tidak berlebihan dan bermakna adalah antara prinsip kejuruteraan perisian tertua; sungguh mengejutkan bahawa kita harus menunggu begitu lama untuk sesuatu seperti Rails.) Kerangka itu meneka hubungan antara pelbagai peringkat berdasarkan konvensyen langsung. Sebagai contoh, tidak perlu XML, anotasi atau sejenisnya, untuk memberitahu rangka kerja bahawa kelas pelanggan disokong oleh customersjadual; Lapisan pembungkus pangkalan data ActiveRecord Rails meneka ini (sambil mengambil kira pluralisasi dan penggunaan huruf besar). Rails melangkah sehingga menambahkan secara tersirat dan dinamik atribut untuk mencerminkan lajur pangkalan data: alast_namelajur secara automatik menjadikan last_nameatribut menjadi wujud.

Dalam kes khas, di mana konvensyen tidak memenuhi keperluan anda, anda masih boleh menambahkan konfigurasi, menggunakan kod Ruby tulen atau format YAML seperti Ruby ringan, yang kedua-duanya menghilangkan tanda kurung berlebihan dan tanda penutup XML. Tetapi anda harus mematuhi lalai sekiranya boleh. Rails adalah "perisian berpandangan", yang menjadikannya lebih mudah ketika anda mengikuti arus.

Rails adalah kerangka "termasuk bateri" (frasa yang dipopulerkan oleh Python): merangkumi semua yang anda perlukan untuk aplikasi Web yang disokong pangkalan data standard, dari lapisan akses data, melalui model, pandangan, dan pengawal. Ini membolehkan anda menumpukan perhatian pada apa yang khusus untuk aplikasi anda, dan bukannya mengekod fungsi umum atau mencari perpustakaan sumber terbuka yang berintegrasi bersama.

Dinamisme dan refleksi

Kerangka kerja Java juga bergerak menuju penggunaan refleksi dan pemrograman yang lebih besar. Spring, misalnya, menggunakan pantulan untuk memasukkan semua kepingannya bersama dengan suntikan kebergantungan, berbeza dengan pendekatan yang lebih statik dari timbunan pelayan Java EE standard. Hibernate, kerangka pemetaan hubungan-objek yang popular, melakukan pemetaannya dengan pemrograman metam dinamik, mengemas kini kod bytek pada waktu berjalan, berbeza dengan kerangka kerja akses data awal, yang memerlukan penjanaan kod sumber atau bytecode yang rumit pada waktu pengembangan.

Pembangun Hibernate harus menggunakan beberapa teknik canggih untuk mencapai fungsi ini, tetapi dalam Ruby, pemrograman metaprogram adalah bahagian semula jadi dari bahasa yang Rails, pada waktu runtime, secara dinamis menghasilkan bukan sahaja pemetaan, tetapi juga definisi kelas lapisan perniagaan yang diperlukan untuk mengakses dan paparkan pangkalan data yang mendasari, dengan itu meminimumkan keperluan pengkodan manual atau pembuatan kod yang tidak fleksibel.

Menyokong proses pembangunan

Sekitar akhir tahun 1990-an, programmer Java mendapat "ujian dijangkiti" dengan kerangka kerja JUnit, tetapi ujian menulis untuk aplikasi di sisi pelayan selalu sukar. Spring kini menghasilkan ujian bersama dengan aplikasi Web. Rails melakukan perkara yang sama, memanfaatkan dinamisme dan pemrograman metaprogram untuk menyokong pelbagai jenis ujian: ujian unit, yang menjalankan kaedah individu dari kelas model; ujian fungsional, yang berfungsi pada tahap permintaan Web individu; dan ujian integrasi, yang menjalankan serangkaian permintaan Web dalam sesi pengguna simulasi.

Alat Ant dan Maven yang popular menyeragamkan automasi binaan di Java. Rel juga menjadikan bangunan mudah dengan alat penyusun Ruby ; ia menambahkan sistem migrasi yang inovatif, yang mengotomatiskan peningkatan (atau rollback) skema dan data pangkalan data.