Saya penggemar Linux dan perangkat lunak sumber terbuka. Saat ini, saya menggunakan Arch Linux (ya, saya menggunakan arch btw) dengan i3 sebagai window manager. Saya berasumsi bahwa riwayat saya bersama dengan vim cukup khas. Itu berasal dari “Hah? Apa-apaan?" dari “Ah oke” menjadi “Itu masuk akal”. Kesimpulan saya adalah saya harus menggunakannya lebih sering. Itulah keadaan saat ini. Suatu hari (kemarin), saya menemukan plugin fzf-vim di suatu tempat di internet. Ini memungkinkan eksekusi pencarian fuzzy melalui fzf (alat pencarian fuzzy untuk terminal) dan membuka hasil pencarian sebagai buffer baru di vim. Jadi saya berkata pada diri sendiri: “Mengapa menggunakan elektron mengasapi seperti vscode atau IDE seperti Eclipse jika Anda selalu hanya mengedit file?”

Hasil

Tujuan percobaan saya adalah membuat layanan toko katalog sederhana yang memuat harga berbagai produk dari database melalui titik akhir REST. Untuk database, saya ingin menggunakan database PostgreSQL yang berjalan di dalam container Docker. Untuk layanan mikronya sendiri, saya menggunakan Quarkus karena memberikan pengalaman pengembang yang sangat keren dan Anda dapat menjalankannya dengan mudah di terminal. Quarkus adalah Java Framework yang mengimplementasikan standar berbeda dari Jakarta EE dan Eclipse Microprofile. Tantangannya seharusnya: “Jangan sentuh file apa pun dengan apa pun kecuali vim!”

Pengaturan

Seperti yang sudah disebutkan, untuk proyek ini saya menggunakan Docker dan Java. Jadi tentu saja, saya harus menginstal Docker dan hal-hal yang berhubungan dengan Java (JDK, Maven,…). Untuk vim, saya menginstal vim-plug untuk mengelola plugin lain dan kemudian fzf untuk vim. Selain itu, saya mengonfigurasinya untuk membuka menu ':Files' di Ctrl+P (seperti di vscode):

panggil plug#begin('~/.vim/plugged')
Pasang 'junegunn/fzf.vim'
panggil plug#end()

nnoremap ‹silent› ‹C-p› :Files‹CR›

Untuk proyek itu sendiri, saya menggunakan halaman Mulai Cepat Quarkus yang menginisialisasi struktur dasar proyek untuk Anda dan menyediakan folder zip dengan proyek tersebut. Mungkin itu curang tapi saya tidak peduli.

Rintisan

Wizard proyek Quarkus telah menghasilkan beberapa kelas tetapi tentu saja, saya tidak ingin menyebut kelas entitas saya "MyEntity" atau kelas antarmuka REST "GreetingResource", jadi sudah waktunya untuk menghapusnya. Ini ternyata menyakitkan setelah navigasi melalui direktori yang berbeda tidak begitu mudah:

Jadi, saya berpikir mungkin ada cara untuk menavigasi folder seperti file. Tidak ada (atau setidaknya saya tidak dapat menemukannya). Jadi merestrukturisasi proyek contoh sudah agak mengganggu. Dan struktur paket proyek Java memberikan kontribusinya. Untungnya, Quarkus hanya menghasilkan dua file kelas dalam satu direktori. Jadi, saya menghapusnya dan membuat tiga direktori untuk titik akhir, kelas pengontrol, dan model data. Akhirnya, kegembiraan pembangunan benar-benar bisa dimulai!

Model Data

Saya membuat kelas entitas pertama yang harus mewakili kategori dalam sistem toko:

Pada titik ini, saya menyadari bahwa saya tidak tahu ke mana harus mengimpor kelas bekas. Hm. Ya. Siapa yang bisa meramalkan hal itu? Saya mencari di Google “vim java” dan menemukan halaman tentang penggunaan vim sebagai IDE Java lengkap (https://spacevim.org/use-vim-as-a-java-ide/). Tapi sejujurnya, itu sepertinya berlebihan meskipun tangkapan layarnya terlihat cukup keren. Tujuannya bukan untuk mengetahui apakah Spacevim dapat menggantikan IDE Java tradisional seperti Eclipse, tetapi untuk mengetahui apakah vim dengan plugin pembuka file cukup untuk mengembangkan layanan mikro. Patut dipertanyakan apakah Java benar-benar merupakan keputusan yang baik. Sementara itu saya meragukannya (Paket sialan!). Tapi oke, saya bisa mencari di Google saja beberapa kelas yang harus saya impor.

Jadi, saya membuat semua kelas entitas. Dengan ini, fitur jendela terpisah dan salin-tempel menjadi sebuah berkah. Saya yakin, ini akan mulai menyenangkan segera setelah semua kelas dibuat dan saya dapat menggunakan fitur buka cepat yang merupakan bagian dari plugin fzf.

Pada titik ini, saya menyadari bahwa saya harus memasukkan Lombok sebagai ketergantungan pakar. Jadi, saya mencarinya di Repositori Pusat Maven dan menambahkannya. Ini tidak akan lebih mudah di Eclipse. Saya tidak mempercayai Editor Eclipse Maven.

Titik Akhir

Ya, setelah membuat entitas untuk database, saya melanjutkan dengan titik akhir. Bagi sebagian orang, langkah logis berikutnya adalah menulis kelas pengontrol yang mengambil entitas dari database atau bahkan memulai dengan titik akhir untuk menentukan antarmuka. Tapi tidak. Pertama, produk di gudang, lalu di bagian depan toko, dan terakhir di forklift. Ketika saya memikirkannya, analogi ini tidak terlalu masuk akal tetapi harus realistis: pada akhirnya Anda peduli dengan masalah logistik.

Jadi, saya membuat file kelas baru dan inilah saatnya saya memahami bahwa saya tidak boleh membuang kelas contoh. Karena saya harus mencari contoh Quarkus di Google terlebih dahulu untuk mengetahui paket mana yang saya butuhkan.

Saat menulis titik akhir, saya menyadari bahwa meluangkan lebih banyak waktu untuk memikirkan titik akhir adalah ide yang bagus. Beberapa pemfaktoran ulang diperlukan tetapi saya memutuskan untuk melakukannya setelah menulis kelas pengontrol. Ya, saya seharusnya memulai dengan arsitektur titik akhir REST terlebih dahulu atau kelas yang memuat data dari database.

Pengontrol Basis Data

Bagian ini juga kurang spektakuler dibandingkan menjengkelkan. Saya menyadari bahwa saya mengetahui Java Persistence API jauh lebih sedikit daripada yang saya kira. Jadi, pada dasarnya banyak googling dan copy-paste. Dan saya hampir menyerah ketika saya menyadari pada dasarnya saya sudah selesai.

Jalankan Pertama

Saya menulis semua kode yang diperlukan yang dapat saya pikirkan. Jadi sekarang, waktunya untuk melihat apakah semua pekerjaan berhasil. Sudah waktunya untuk benar-benar mencari tahu pengembang seperti apa saya ini. Sudah waktunya untuk mencari tahu apakah saya tahu apa yang saya lakukan atau apakah saya hanya mengetik omong kosong.

Saya memasukkan kata-kata ajaib ke terminal saya yang akan memulai proses kompilasi dan meluncurkan kerangka kerja. Saat ini kompiler akan memeriksa tanpa ampun setiap baris yang saya tulis. Inilah waktunya, waktunya… Aku kehilangan benangku. Inilah hasilnya.

./mvnw quarkus:dev

Ternyata hanya sedikit kesalahan… Kesalahan Sintaks yang sangat mendasar tetapi hanya sedikit saja. Hm. Saya sungguh mengharapkan lebih. Tapi oke, ini hanya kesalahan kompilasi. Mungkin akan ada banyak kesalahan runtime.

Ya… memperbaikinya menyebabkan lebih banyak kesalahan terlihat:

Setelah memperbaiki kesalahan kompilasi, server akhirnya diluncurkan. Saya sangat bersemangat dan ingin menguji titik akhir. Sekarang setelah beberapa kesalahan kompilasi ini, kerja keras saya akan membuahkan hasil. Sekarang, saya akan melihat apakah seluruh operasi ini merupakan percobaan yang bagus. Namun, kemudian ia melemparkan IllegalArgumentExceptions dan mogok.

Sepertinya parameter jalur harus berupa String dan bahkan bukan UUID. Pertanyaan muncul di benak saya apakah lebih masuk akal untuk mengonversinya di setiap titik akhir atau membuat ParamConverter… Saya tidak ingin membuat ParamConverter karena dengan begitu, saya harus mencari begitu banyak Javadocs di Google lagi meskipun itu akan terjadi pendekatan yang lebih bersih/lebih umum. Tetapi menemukan semua sintaks ini dan mengimpor barang lagi sangat berhasil tanpa kompilasi otomatis. Kesalahan ini saya dapatkan yang lain: letion. Jadi, saya tidak melakukannya. Setelah memperbaiki kesalahan secara individual di setiap kelas, log berikut muncul:

Karena alasan tertentu, kacang transaksional tidak dapat diinisialisasi. Tanpa membaca seluruh pesan kesalahan, saya berasumsi itu karena properti persistensi yang hilang dan database yang hilang. Jadi saya membuat file komposisi buruh pelabuhan dengan database postgres dan menambahkan properti aplikasi yang diperlukan:

Ya, baiklah… Itu tidak berhasil.

Setelah beberapa waktu, saya menemukan bahwa masalahnya adalah hilangnya anotasi @ApplicationScoped di kelas layanan. Menambahkannya cukup mudah. Fitur makro vim memungkinkan untuk dengan mudah merekam pengetikan pernyataan import diikuti dengan memberi anotasi pada kelas. Asyiknya hanya menekan dua tombol untuk menjalankan langkah yang sama di file lain. Pada langkah berikutnya, saya harus memperbaiki pertanyaan JPQL saya:

Dan kemudian, itu berhasil…

Akhirnya, saya bisa mengujinya. Saya menambahkan beberapa data melalui klien sql postgres dan memanggil titik akhir. Dan hasilnya adalah ini:

Ya, tidak persis seperti yang kuinginkan. Saya harus menambahkan ketergantungan Resteasy Jsonb Quarkus. Hasilnya setidaknya adalah daftar json:

Saya menambahkan kembali data di database, mengubah pengaturan menjadi update alih-alih drop-and-create, dan memulai ulang server. Sekali lagi hasil yang sama:

Dan setelah beberapa kali mencoba, saya menyadari bahwa saya lupa menambahkan ekstensi jsonb (tidak, bayangkan bagaimana ini terjadi). Kemudian, ternyata:

Akhirnya! Setelah bertahun-tahun. Semua titik akhir berfungsi. Perasaan terbaik di dunia!

Kesimpulan

Apakah saya akan melakukannya lagi? Tidak. Apakah itu ide yang bagus? Tidak. Apakah itu menyenangkan? Tidak. Apakah aktivitas ini bagus untuk Sabtu sore yang hujan? Mungkin semacam itu, tapi pasti ada yang lebih baik. Apakah saya mempelajari sesuatu? Ya. vim bukan IDE dan IDE menyederhanakan pengembangan perangkat lunak. Hasil yang mengejutkan!

Pendekatan menggunakan vim saja mungkin bisa bekerja lebih baik untuk bahasa yang - dan saya mencoba mengatakannya sediplomatis mungkin - tidak terlalu ketat dalam sintaksis dan struktur foldernya (ya, saya sedang berbicara tentang Javascript dan Python). Meskipun demikian, saya belajar menghargai beberapa fitur keren dari vim. Terutama rekaman makro adalah sesuatu yang sangat saya rindukan di Eclipse. Di masa depan, saya akan memeriksa ekstensi IDE seperti vrapper, untuk mengintegrasikan pengalaman bagus yang saya buat dengan vim di Eclipse.