Setelah mengenal tipe data, fungsi, class, dan error handling, kita kini merangkai semuanya menjadi satu program nyata: aplikasi CLI pencatat tugas. Alat berbasis baris perintah menjadi fondasi banyak peranti pengembangan aplikasi modern — dari git, curl, hingga docker — sehingga memahami pola pembangunannya memberi bekal kuat untuk proyek backend maupun DevOps. Aplikasi yang akan kita bangun menerima perintah dari terminal, memvalidasi argumen, menyimpan data ke file JSON lokal, dan dikemas sebagai executable JAR yang dapat dijalankan tanpa lingkungan pengembangan. Proyek ini disusun dalam empat bagian yang saling membangun, sehingga setiap bagian menghasilkan program yang dapat dijalankan dan diuji sebelum melanjutkan ke tahap berikutnya. Kode sumber lengkap untuk setiap tahap tersedia pada bagian Berkas Sumber di bawah halaman setiap Part.
Tujuan Proyek #
Aplikasi CLI yang akan kita bangun memiliki empat perintah utama:
tambah "<judul>"— menyimpan tugas baru ke penyimpanan lokal,daftar— menampilkan seluruh tugas beserta statusnya,selesai <id>— menandai satu tugas sebagai selesai,hapus <id>— menghapus satu tugas berdasarkan ID.
Setiap perintah mengembalikan exit code yang konsisten sehingga skrip lain atau CI pipeline dapat memeriksa hasil eksekusi secara terprogram. Output normal ditulis ke STDOUT, sementara pesan galat ditulis ke STDERR agar tidak mencemari keluaran normal. Pada akhir proyek, pembaca memiliki executable JAR mandiri yang siap dipakai dalam alur kerja otomasi.
Perilaku yang Diharapkan #
Contoh sesi pemakaian berikut menunjukkan hasil yang ingin kita capai pada akhir proyek:
java -jar tugas.jar tambah "Belajar Kotlin dasar"
java -jar tugas.jar tambah "Bangun aplikasi CLI"
java -jar tugas.jar daftarOutput yang Dihasilkan:
Tugas "Belajar Kotlin dasar" tersimpan dengan id 1.
Tugas "Bangun aplikasi CLI" tersimpan dengan id 2.
[ ] 1. Belajar Kotlin dasar
[ ] 2. Bangun aplikasi CLITugas ditampilkan dengan penanda [ ] untuk yang belum selesai dan [x] untuk yang sudah selesai. Data tersimpan pada berkas tugas.json di samping aplikasi, sehingga tugas tetap terjaga meskipun program ditutup dan dibuka kembali.
Teknologi dan Stack #
Proyek ini menggunakan peranti berikut:
| Komponen | Versi | Tujuan |
|---|---|---|
| Bahasa | Kotlin 2.0.21 | Sintaks ringkas, null-safety bawaan, type inference |
| Build tool | Gradle 8.x dengan Kotlin DSL | Konfigurasi berbahasa Kotlin, dukungan fat JAR |
| Pengujian | kotlin.test | Standar resmi, assertion ringkas, terintegrasi Gradle |
| Penyimpanan | File JSON lokal | Tanpa dependensi server, sederhana, dapat diperiksa manual |
| Packaging | Executable JAR | Satu berkas, dapat dijalankan di JVM mana pun |
Tidak ada library eksternal yang dibutuhkan untuk fungsionalitas inti. Serialisasi JSON ditulis manual pada Bagian 3 agar pembaca memahami format JSON secara langsung sebelum beralih ke library kotlinx.serialization di proyek berikutnya.
Prasyarat #
Sebelum memulai, pastikan peranti berikut sudah terpasang di sistem:
- JDK 21 atau lebih baru (
java -versionmenampilkan versi), - Kotlin compiler 2.0 (
kotlinc -version), - Gradle 8.x (opsional, hanya untuk Bagian 4).
Pembaca juga diharapkan telah menyelesaikan chapter berikut:
- Section Dasar-Dasar Kotlin:
val/var,when, ekspresiif, dan perulangan, - Section Object-Oriented Programming:
data class,sealed class, danenum class, - Section Error Handling:
Result<T>,require(), dantry/catch, - Section Collections:
List,Map, serta operasifilterdanmap.
Tanpa prasyarat tersebut, sebaiknya pelajari dahulu section terkait sebelum melanjutkan ke proyek ini.
Arsitektur #
Aplikasi disusun dalam empat lapis yang berdiri sendiri namun saling terhubung. Lapisan terluar adalah CLI Dispatch, yang menerima argumen baris perintah dan menentukan perintah yang diminta. Lapisan berikutnya berisi Command Handlers untuk tambah, daftar, selesai, dan hapus. Lapisan Storage menangani baca-tulis file JSON, sementara Models mendefinisikan data class Task beserta enum class StatusTask.
Pola when pada lapisan dispatch menggantikan rantai if-else yang panjang. Menambah perintah baru cukup menambah satu cabang beserta fungsi pendukungnya. Lapisan Storage menjadi satu-satunya tempat yang menyentuh sistem berkas, sehingga pengujian command handler dapat dilakukan tanpa menyentuh disk.
Struktur Bagian #
Proyek ini dikerjakan dalam empat bagian berurutan:
| Bagian | Yang Dikerjakan | Hasil yang Diharapkan |
|---|---|---|
| 1. Struktur Aplikasi dan Input | Struktur direktori Gradle, titik masuk main, parsing argumen awal | Aplikasi menerima tambah dan daftar meski belum menyimpan ke disk |
| 2. Validasi dan Penanganan Error | Validasi argumen, pesan galat ramah pengguna, kontrak exit code | Galat input tidak lagi memunculkan stack trace, melainkan pesan terstruktur |
| 3. Penyimpanan Data | Serialisasi manual ke JSON, baca-tulis tugas.json, id otomatis | Tugas tetap tersimpan setelah aplikasi ditutup dan dibuka kembali |
| 4. Pengujian dan Packaging | Unit test dengan kotlin.test, fat JAR via Gradle Shadow plugin | Satu berkas tugas.jar dapat dijalankan di JVM mana pun |
Mulailah dari Bagian 1 dan ikuti urutannya karena setiap Bagian dibangun di atas Bagian sebelumnya. Setelah Bagian 4 selesai, kita siap melangkah ke proyek Sistem Manajemen Perpustakaan yang memperkenalkan pemodelan domain dengan banyak entitas yang saling berhubungan.
Referensi Lanjutan #
- Kotlin command-line compiler — rujukan kompilator CLI Kotlin sebagai basis packaging aplikasi command-line
- Get started with Kotlin — panduan memulai proyek Kotlin untuk membentuk struktur aplikasi CLI
Rancang struktur direktori, titik masuk main, dan parsing argumen command-line menggunakan when.
Buka → # Bagian 2: Validasi dan Penanganan ErrorTambahkan validasi input dengan sealed class galat, Result, dan penerjemahan exception menjadi pesan user-friendly.
Buka → # Bagian 3: Penyimpanan DataBangun penyimpanan tugas ke file JSON lokal dengan serialisasi manual dan pembacaan regex ringan.
Buka → # Bagian 4: Pengujian dan PackagingTulis unit test dengan kotlin.test untuk logika bisnis dan paket aplikasi sebagai executable JAR dengan Gradle.
Buka →