Setelah membangun aplikasi CLI sederhana, kita naik ke proyek yang lebih besar: Sistem Manajemen Perpustakaan. Proyek ini memodelkan domain nyata dengan beberapa entitas yang saling berhubungan: Buku, Anggota, dan Transaksi. Kita akan menerapkan pemodelan domain, operasi CRUD, logika bisnis peminjaman, dan persistensi ke file JSON. Latihan ini melatih keterampilan berpikir dalam entitas domain: bagaimana satu transaksi menghubungkan buku dan anggota, kapan stok berkurang, dan kapan status berubah. Setiap Bagian menghasilkan program yang dapat dijalankan dan diuji sebelum melanjutkan ke tahap berikutnya, sehingga kesalahan desain dapat ditemukan sejak dini sebelum kode bertambah kompleks.
Tujuan Proyek #
Sistem perpustakaan yang akan kita bangun mendukung operasi berikut:
- Menambah, mencari, memperbarui, dan menghapus Buku.
- Menambah, mencari, dan menghapus Anggota.
- Meminjamkan Buku kepada Anggota (membuat Transaksi, mengurangi stok).
- Mengembalikan Buku (menandai Transaksi selesai, menambah stok).
- Menyimpan daftar buku ke file JSON dan memuatnya kembali.
Setiap operasi memvalidasi kondisi bisnis: stok tidak boleh negatif, transaksi tidak boleh dikembalikan dua kali, dan ID harus unik. Output operasi yang gagal memberikan pesan yang menjelaskan kondisi mana yang tidak terpenuhi.
Perilaku yang Diharapkan #
Contoh sesi pemakaian menunjukkan alur peminjaman dan pengembalian:
java -jar perpustakaan.jar pinjam B001 A001
java -jar perpustakaan.jar kembalikan T001Output yang Dihasilkan:
Transaksi T001: buku=B001 anggota=A001 status=AKTIF
Transaksi T001: status=DIKEMBALIKANPeminjaman menghasilkan transaksi dengan status AKTIF dan mengurangi stok buku. Pengembalian menandai transaksi sebagai DIKEMBALIKAN dan menambah stok kembali. Konsistensi antara stok buku dan daftar transaksi menjadi invariant yang dijaga oleh kode domain.
Teknologi dan Stack #
Proyek ini menggunakan peranti berikut:
| Komponen | Versi | Tujuan |
|---|---|---|
| Bahasa | Kotlin 2.0.21 | data class, enum class, Result<T> untuk domain modeling |
| Build tool | Gradle 8.x dengan Kotlin DSL | Struktur multi-file, test runner bawaan |
| Pengujian | kotlin.test | Standar resmi, assertion ringkas |
| Penyimpanan | File JSON lokal | Tanpa server, sederhana, mudah diperiksa |
| Domain modeling | data class + enum class | Pemodelan entitas dan status yang aman dari tipe |
Proyek ini tidak membutuhkan database eksternal pada tahap awal. Bagian 4 memperkenalkan persistensi ke JSON; pertanyaan database SQLite akan dibahas di proyek REST API Manajemen Tugas.
Prasyarat #
Pembaca diharapkan telah menyelesaikan chapter berikut:
- Section Object-Oriented Programming:
data class,enum class, dancopy(), - Section Error Handling:
Result<T>,require(), dancheck(), - Section Collections:
Map,List,mutableMapOf,filter, danfind, - Proyek Aplikasi Command Line: struktur Gradle, titik masuk
main, dan polawhenuntuk dispatch perintah.
Tanpa prasyarat tersebut, sebaiknya pelajari dahulu section atau proyek terkait sebelum melanjutkan ke proyek ini.
Arsitektur #
Inti proyek ini adalah domain model yang menangkap entitas dan relasinya. Transaksi tidak menyimpan objek Buku atau Anggota secara langsung; ia hanya menyimpan ID referensi. Pola ini lazim disebut aggregation by reference dan menjaga serialisasi tetap sederhana. Layanan Perpustakaan menjadi facade yang mengoordinasikan operasi pada ketiga entitas dan menjaga invariant bisnis.
Pemisahan entitas dari layanan membuat pengujian menjadi mudah: Buku, Anggota, dan Transaksi adalah data class murni tanpa efek samping, sehingga dapat diuji sebagai nilai. Kelas Perpustakaan mengandung state dan logika bisnis; inilah tempat invariant seperti “stok tidak boleh negatif” diperiksa.
Struktur Bagian #
Proyek ini dikerjakan dalam empat bagian berurutan:
| Bagian | Yang Dikerjakan | Hasil yang Diharapkan |
|---|---|---|
| 1. Pemodelan Domain | Buku, Anggota, Transaksi, StatusTransaksi beserta validasi invariant | Model domain dapat dikonstruksi dan divalidasi tanpa logika bisnis |
| 2. Pengelolaan Buku dan Anggota | Operasi CRUD dengan ID unik, pencarian sederhana | Daftar buku dan anggota dapat dimanipulasi konsisten |
| 3. Peminjaman dan Pengembalian | Logika transaksi, aturan stok, perubahan status | Transaksi mengubah stok dan status sesuai aturan bisnis |
| 4. Persistensi dan Pengujian | Serialisasi JSON, unit test untuk logika bisnis | Data tersimpan antar sesi; semua aturan bisnis teruji otomatis |
Mulailah dari Bagian 1 dan ikuti urutannya karena setiap Bagian dibangun di atas Bagian sebelumnya. Setelah Bagian 4 selesai, kita siap melangkah ke proyek Aplikasi Keuangan Pribadi yang memperkenalkan agregasi data dan anggaran bulanan. Pemilihan domain perpustakaan sebagai studi kasus memberikan keseimbangan: cukup kaya untuk melatih hubungan antar entitas, namun tetap dapat dipahami tanpa latar belakang bisnis yang rumit.
Referensi Lanjutan #
- Kotlin documentation home — halaman utama dokumentasi Kotlin sebagai rujukan fitur yang dipakai di seluruh bagian proyek perpustakaan
- Get started with Kotlin — panduan memulai proyek Kotlin sebagai fondasi tiap bagian proyek
Rancang data class Buku, Anggota, Transaksi, dan enum StatusTransaksi sebagai fondasi sistem perpustakaan.
Buka → # Bagian 2: Pengelolaan Buku dan AnggotaImplementasikan operasi CRUD untuk buku dan anggota dengan validasi ID unik dan format email.
Buka → # Bagian 3: Peminjaman dan PengembalianImplementasikan logika peminjaman dan pengembalian beserta aturan stok dan status transaksi.
Buka → # Bagian 4: Persistensi dan PengujianTambahkan persistensi ke file JSON dan unit test untuk logika peminjaman/pengembalian.
Buka →