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:

bash
java -jar tugas.jar tambah "Belajar Kotlin dasar"
java -jar tugas.jar tambah "Bangun aplikasi CLI"
java -jar tugas.jar daftar

Output yang Dihasilkan:

text
Tugas "Belajar Kotlin dasar" tersimpan dengan id 1.
Tugas "Bangun aplikasi CLI" tersimpan dengan id 2.
[ ] 1. Belajar Kotlin dasar
[ ] 2. Bangun aplikasi CLI

Tugas 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:

KomponenVersiTujuan
BahasaKotlin 2.0.21Sintaks ringkas, null-safety bawaan, type inference
Build toolGradle 8.x dengan Kotlin DSLKonfigurasi berbahasa Kotlin, dukungan fat JAR
Pengujiankotlin.testStandar resmi, assertion ringkas, terintegrasi Gradle
PenyimpananFile JSON lokalTanpa dependensi server, sederhana, dapat diperiksa manual
PackagingExecutable JARSatu 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 -version menampilkan 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, ekspresi if, dan perulangan,
  • Section Object-Oriented Programming: data class, sealed class, dan enum class,
  • Section Error Handling: Result<T>, require(), dan try/catch,
  • Section Collections: List, Map, serta operasi filter dan map.

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:

BagianYang DikerjakanHasil yang Diharapkan
1. Struktur Aplikasi dan InputStruktur direktori Gradle, titik masuk main, parsing argumen awalAplikasi menerima tambah dan daftar meski belum menyimpan ke disk
2. Validasi dan Penanganan ErrorValidasi argumen, pesan galat ramah pengguna, kontrak exit codeGalat input tidak lagi memunculkan stack trace, melainkan pesan terstruktur
3. Penyimpanan DataSerialisasi manual ke JSON, baca-tulis tugas.json, id otomatisTugas tetap tersimpan setelah aplikasi ditutup dan dibuka kembali
4. Pengujian dan PackagingUnit test dengan kotlin.test, fat JAR via Gradle Shadow pluginSatu 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 #