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:

bash
java -jar perpustakaan.jar pinjam B001 A001
java -jar perpustakaan.jar kembalikan T001

Output yang Dihasilkan:

text
Transaksi T001: buku=B001 anggota=A001 status=AKTIF
Transaksi T001: status=DIKEMBALIKAN

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

KomponenVersiTujuan
BahasaKotlin 2.0.21data class, enum class, Result<T> untuk domain modeling
Build toolGradle 8.x dengan Kotlin DSLStruktur multi-file, test runner bawaan
Pengujiankotlin.testStandar resmi, assertion ringkas
PenyimpananFile JSON lokalTanpa server, sederhana, mudah diperiksa
Domain modelingdata class + enum classPemodelan 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, dan copy(),
  • Section Error Handling: Result<T>, require(), dan check(),
  • Section Collections: Map, List, mutableMapOf, filter, dan find,
  • Proyek Aplikasi Command Line: struktur Gradle, titik masuk main, dan pola when untuk 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:

BagianYang DikerjakanHasil yang Diharapkan
1. Pemodelan DomainBuku, Anggota, Transaksi, StatusTransaksi beserta validasi invariantModel domain dapat dikonstruksi dan divalidasi tanpa logika bisnis
2. Pengelolaan Buku dan AnggotaOperasi CRUD dengan ID unik, pencarian sederhanaDaftar buku dan anggota dapat dimanipulasi konsisten
3. Peminjaman dan PengembalianLogika transaksi, aturan stok, perubahan statusTransaksi mengubah stok dan status sesuai aturan bisnis
4. Persistensi dan PengujianSerialisasi JSON, unit test untuk logika bisnisData 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 #