Mengapa Pengembang Java Harus Memberi Kesempatan pada Grails?

Diterbitkan: 2022-03-11

Java memiliki ekosistem yang telah matang selama bertahun-tahun pengembangan, menjadikannya sebagai salah satu platform paling andal di luar sana. Namun tidak memiliki sarana yang diperlukan untuk menyelesaikan pekerjaan dengan cepat, terutama untuk hal-hal seperti aplikasi web. Dalam upaya untuk menghindari frustrasi dengan jenis masalah ini, pengembang sering memilih alih-alih bahasa implementasi dan kerangka kerja web modern mereka, seperti Ruby dengan Ruby on Rails, Python dengan Django, dan seterusnya. Tidak seperti Java, ini menyediakan jalur yang jauh lebih ramping untuk membangun aplikasi web.

Mengapa Pengembang Java Harus Memberi Kesempatan pada Grails?

Pengembang web Java: temui Grails dan temukan apa yang Anda lewatkan.
Menciak

Untungnya, bagi pengembang Java yang ingin membangun aplikasi web, ada cara yang lebih baik, dan ini melibatkan Grails. Pada artikel ini, kita akan melihat bagaimana Grails dengan Groovy adalah alternatif yang layak di ranah JVM. Kami akan melihat beberapa contoh di mana Grails menarik bagi kami sebagai pengembang Java dan mungkin menggoda orang lain untuk mencobanya juga.

Cerita

Di startup tempat saya bekerja, kami memiliki masalah yang tepat ini. Kami memiliki aplikasi Spring yang sulit untuk dikerjakan. Dengan pertumbuhannya yang semakin besar, kami segera menemukan bahwa pemfaktoran ulang dan penambahan fungsionalitas membutuhkan waktu lebih lama dari yang seharusnya. Menggabungkannya dengan beberapa motivasi lain membuat kami memutuskan untuk menulis ulang aplikasi inti kami. Kami juga terbuka untuk mengubah atau mengganti tumpukan teknologi yang ada. Grails tampak seperti pilihan yang layak karena berjalan di JVM dan dibangun di atas teknologi yang sudah kita ketahui. Ini menggunakan bahasa pemrograman Groovy tetapi pada saat yang sama memungkinkan Anda untuk mencampurnya dengan Java. Jadi kami mengambil risiko.

Kecepatan Penuh ke Depan

Satu hal yang sangat diunggulkan oleh Grails adalah membuatnya mudah untuk memulai proyek baru. Ini semudah menjalankan perintah yang membuat struktur proyek dengan semua folder yang diperlukan untuk kelas yang akan Anda tambahkan nanti. Menambahkan kelas model, pengontrol, layanan, dan halaman web membutuhkan sedikit usaha yang sama. Satu-satunya hal yang perlu Anda perhatikan adalah memberi nama dan menempatkan barang dengan benar. Tidak seperti Java, hampir tidak ada kode boilerplate yang perlu ada hanya karena memang perlu. Ini sebagian dimungkinkan dengan menggunakan Spring dan Hibernate yang merupakan dua pilar Grails, serta konsep pengkodean berdasarkan konvensi. Untuk menjalankan proyek, Grails dibundel dengan Apache Tomcat sebagai server pengembangan. Yang harus kita lakukan adalah menjalankan proyek di IDE kita dan server akan diaktifkan dengan kode yang kita gunakan. Juga, Object Relational Mapping (GORM) Grails dengan Hibernate akan menangani pembuatan database untuk kita. Untuk menggunakan database yang ada, kita perlu mengonfigurasi properti koneksi JDBC atau membiarkannya secara default untuk menggunakan instance dalam memori. Setelah server dengan Grails berjalan (membutuhkan sedikit lebih banyak daripada aplikasi Spring MVC), kita dapat memodifikasi kode dan fungsionalitas penyebaran panas akan membuat sesi debug kita dilengkapi dengan versi terbaru. Satu-satunya kelas yang tidak dapat dimuat ulang dengan cara ini adalah kelas entitas.

Mengisi database dapat dilakukan dengan menggunakan skrip SQL, tetapi itu bisa membosankan. Semua proyek Grails berisi kelas Bootstrap yang akan dijalankan saat aplikasi kita dijalankan. Di kelas ini, kita dapat menyimpan atau memodifikasi data dan dengan demikian menginisialisasi status aplikasi kita. Ini terbukti sangat berguna bagi kami sehingga kami memiliki beberapa kasus uji dalam versi pengembangan segera.

Di kelas Bootstrap, kita juga dapat menggunakan kondisi "jika" untuk memeriksa tipe lingkungan (pengembangan, pengujian, produksi, dll.) dan memodifikasi data yang sesuai.

Memanipulasi Data

Salah satu hal yang langsung menarik perhatian kami dengan Grails adalah kemudahan bekerja dengan data. Membaca dari database adalah tugas yang perlu dilakukan berulang-ulang. Dan seringkali itu sederhana. Seperti mengambil satu atau lebih entitas yang memenuhi kriteria tertentu dan kemudian menggabungkannya. Mengapa tidak menggunakan pencari dinamis untuk itu? Ini adalah cara menanyakan data di mana metode dibuat secara dinamis saat runtime. Yang harus Anda lakukan adalah mengikuti konvensi penamaan.

 def users = User.findAllByLastNameLikeOrAgeGreaterThan('Doe%', 30)

Baris di atas akan mengambil semua objek Pengguna dengan nama belakang dimulai dengan "Doe" atau usia lebih dari 30. Ya, bukan kasus yang sangat canggih tetapi Anda mendapatkan intinya.

Bagaimana jika kita ingin memfilter daftar ini juga untuk daftar yang memiliki properti "failedLogins" lebih besar dari 10? Dan bagaimana jika kita ingin mengurutkannya berdasarkan tanggal pembuatannya? Dan bagaimana jika kami ingin menggabungkan nama depan mereka atau menemukan usia maksimum pengguna yang dikembalikan?

 users = users.findAll() { it.failedLogins > 10 } users = users.sort { it.dateCreated } def firstNamesString = users.firstName.join(', ') def maximumAge = users.age.max()

Contoh di atas mungkin terlihat sederhana, tetapi menunjukkan betapa hebatnya Grails untuk membuat kueri, memfilter, dan memanipulasi data. Di Java 8, Anda dapat mencapai hasil yang serupa untuk beberapa kasus ini, tetapi masih memerlukan lebih banyak kode daripada Grails.

Terkadang Saya Ingin Membuat Yang Berbeda

Sebuah konstruktor dinamis atau konstruktor argumen bernama adalah fitur yang banyak dari kita ingin miliki di Jawa. Sangat bagus untuk menentukan konstruktor mana yang diizinkan oleh kelas tertentu, tetapi dalam banyak kasus Anda hanya ingin mengatur beberapa properti dan mendapatkan instance darn. Groovy menambahkan konstruktor khusus untuk setiap entitas yang pada dasarnya mengambil keanggunan peta sebagai input dan menyetel properti dengan entri peta.

 def Person = new Person(name: 'Batman', age: 57)

Pendekatan ini mengarah ke kode yang jauh lebih ekspresif dan menghindari kebutuhan untuk semua kode boilerplate konstruktor.

Dan BTW, berikut adalah beberapa contoh kehebatan dan keanggunan peta Groovy:

 def emptyMap = [:] def map = [bread:3, milk:5, butter:2] map['bread'] = 4 map.milk = 6

Ini adalah contoh lain bagaimana kode bisa pendek dan sederhana, namun kuat. Ini menunjukkan bagaimana inisialisasi inline dapat digunakan dan bagaimana nilai peta dapat dimanipulasi dengan cara yang mirip dengan properti objek. Tidak perlu memanggil metode Java tradisional untuk manipulasi dasar, kecuali jika Anda benar-benar menginginkannya.

Kami Membutuhkan Lebih Banyak Kekuatan!

Tentu saja, tidak ada kerangka kerja yang dapat melakukan segalanya, tetapi ketika kita mengisi kekosongan, kita harus melihat apa lagi yang mungkin sudah tersedia sebelum mencoba menerapkan solusi kita sendiri. Untuk memperluas gudang fungsionalitas berbasis Grails kami, kami dapat menggunakan Plugin Grails. Memasang plugin cukup dilakukan dengan menambahkan baris lain di kelas BuildConfig yang ada di setiap proyek Grails (konvensi kode menyerang lagi!).

 compile ':spring-security-core:2.0-RC4'

Baris di atas menambahkan inti keamanan Spring ke aplikasi kita dan hampir tidak ada lagi konfigurasi yang diperlukan untuk menggabungkan fungsi ini.

Ini mirip dengan menggunakan dependensi Maven (yang juga dapat Anda rujuk di kelas konfigurasi yang sama), tetapi plugin biasanya berupa blok yang lebih besar yang berisi seluruh fungsionalitas.

Karena itu, izinkan saya memberi tahu Anda tentang kasus yang harus kami tangani. Kami perlu menerapkan pencarian yang mencakup beberapa entitas data. Grails memiliki plugin Elasticsearch yang mudah digunakan. Seperti yang disebutkan sebelumnya, kita hanya perlu mereferensikan plugin di file konfigurasi dan kita siap melakukannya. Jika kita ingin mencari entitas dari kelas tertentu, kita hanya perlu menambahkan properti statis "dapat dicari" ke kelas itu. Dan jika kita mau, kita bahkan dapat membatasi properti yang akan diizinkan untuk dicari.

 class User { static searchable = { only = name } String name Double salary }

Ini adalah kode yang sangat kecil, tetapi di bawah tenda, Grails dan plugin Elasticsearch akan secara otomatis mengindeks semua pengguna berdasarkan nama dan memungkinkan kita untuk mencari berdasarkan nama. Panggilan pencarian yang sebenarnya juga sangat ringkas:

 User.search("${params.query}")

Jika kita tidak mau, kita tidak akan pernah menyentuh indeks Lucene. Semua akan dilakukan secara otomatis untuk kita. Plugin ini bahkan memiliki API untuk menampilkan hasil pencarian – plugin ini dapat menyorot kecocokan yang ditemukan di dalam teks yang dicari. Ini hanyalah sebuah contoh bagaimana sebuah plugin dapat menyediakan sekumpulan besar fungsionalitas yang dapat membuat kita jauh lebih efisien dengan menghindari kebutuhan kita untuk mengimplementasikannya sendiri.

Kami Masih Membutuhkan Lebih Banyak Tenaga

Plugin sangat bagus, tetapi terkadang kami tidak membutuhkan keseluruhan plugin, kami hanya menginginkan sesuatu yang ekstra. Apakah Anda ingat kapan terakhir kali Anda ingin memiliki metode tambahan pada kelas Java yang ada tetapi Anda tidak ingin (atau tidak bisa) memperluas/menggantinya? Di Groovy, Anda dapat menambahkan metode dan properti ke kelas yang ada, atau bahkan hanya beberapa contoh tertentu. Misalnya, Anda dapat menambahkan metode formatting ke kelas java.util.Date yang luar biasa ketika Anda ingin memformat tanggal secara konsisten dan hanya tidak ingin menulis kelas util statis atau menentukan berbagai filter.

 Date.metaClass.formatDate = { delegate.format("dd.MM.yyyy") }

Bagaimana jika Anda ingin mengurutkan daftar pengguna berdasarkan nilai yang dihitung dan Anda hanya memerlukan ini dalam satu kasus (yaitu menambahkan metode baru di kelas Pengguna akan menimbulkan polusi)? Anda dapat menambahkan properti pada masing-masing instance tersebut, lalu mengurutkan atau memfilter koleksi berdasarkan properti tersebut:

 user.metaClass.computedProp = 312 * 32 * 3

Penulis groovy telah menambahkan banyak peningkatan ke beberapa kelas inti Java, jadi kita tidak perlu melakukannya. Di bawah ini adalah beberapa contoh.

Menggunakan "minus" untuk menghapus semua elemen dari koleksi yang ada di koleksi lain.

 assert [1, 2, 3, 4, 4, 5] - [2, 4] == [1, 3, 5]

Metode tambahan untuk memanipulasi objek java.util.Date yang sering kali berguna, seperti menambah/mengurangi hari dari tanggal atau mendapatkan/menyetel bidang tanggal tertentu tanpa mengonversinya ke Calendar atau menggunakan pustaka tambahan.

 def yesterdayAllMyTroublesSeemedSoFarAway = new Date() - 1 def myAwesomeAnniversaryYear = myAwesomeDate[Calendar.YEAR] + 1 myAwesomeDate.set(year: myAwesomeAnniversaryYear, second: 0)

Saat Anda ingin benar-benar mendapatkan deskriptif dengan manipulasi tanggal, Anda cukup menggunakan kelas TimeCategory yang ditambahkan Groovy:

 use (TimeCategory) { println 1.minute.from.now println 10.hours.ago def someDate = new Date() println someDate - 3.months }

Palu dan Paku

Lalu ada IDE. GGTS berbasis Eclipse dan IntelliJ IDEA disiapkan untuk bekerja dengan Grails. Mereka memahami struktur proyek (dan akan membantu Anda menavigasi folder dan sumber daya) dan memiliki pintasan untuk perintah yang paling sering Anda gunakan (misalnya, menambahkan pengontrol, menambahkan halaman, menjalankan proyek, dll.). Dengan Grails Anda akan menjalankan perintah (untuk menjalankan proyek atau menyiapkan fungsionalitas plugin baru) dan Anda akan memerlukan konfigurasi yang berbeda, yang juga dicakup oleh IDE. Penyelesaian kode bekerja dengan baik di halaman templat web Grails di mana Anda akan sering merujuk pengontrol dan tindakan. Ada juga IDE lain yang dapat digunakan dengan Grails seperti Netbeans, TextMate, Emacs, dan lainnya.

Bagaimana dengan Sisi Gelap?

Sama seperti segala sesuatu dalam hidup, ada peringatan dengan Grails juga. Ada banyak keajaiban yang dilakukan di bawah tenda yang seringkali bisa menjadi hal yang baik, tetapi terkadang hasilnya tidak seperti yang Anda harapkan. Bug akan terjadi hanya karena tidak menggunakan pengetikan (ya, jenis adalah opsional di Groovy) dan tidak cukup berhati-hati. Dan mungkin Anda tidak akan melihat kesalahan sampai terlambat. Juga, sangat menggoda untuk menulis satu kalimat untuk mengesankan rekan kerja Anda. Dan dirimu. Tetapi baris kode yang kuat ini mungkin tidak terlalu jelas bagi rekan kerja Anda. Atau bahkan untuk diri sendiri dalam beberapa bulan. Itu sebabnya saya pikir Grails menuntut lebih banyak disiplin pemrograman daripada beberapa kerangka kerja yang lebih tradisional.

Waktu adalah uang

Pengkodean seharusnya tidak memakan lebih banyak waktu hanya karena kerangka kerja Anda saat ini menuntutnya. Apalagi dengan semakin banyaknya perusahaan rintisan akhir-akhir ini, penting untuk fokus pada tugas-tugas yang benar-benar penting dan seefisien mungkin. Waktu memang uang dan waktu untuk memasarkan sangat penting. Anda harus dapat bertindak cepat dan menerapkan solusi sebelum waktu habis dan pesaing Anda mengalahkan Anda.

Teman-teman saya yang bekerja dengan Ruby on Rails atau Python/Django telah lama memberi tahu saya betapa kerennya teknologi itu. Dan sungguh terasa konyol untuk memikirkan berapa banyak lagi waktu yang saya perlukan di Java untuk menulis kode yang menyimpan sesuatu di database dan menampilkannya di halaman web. Grails mungkin memang jawaban yang berguna. Bukannya Anda tidak bisa melakukan ini dengan Java murni, Spring MVC, dan Hibernate. Anda bisa. Aplikasi Anda bahkan mungkin berjalan sedikit lebih cepat. Tetapi Anda akan menyelesaikan pekerjaan lebih cepat dengan Grails.

Terkait: Mengapa Anda Perlu Meng-upgrade ke Java 8?