Sistem Peminjaman
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 100 dari 107.
Tantangan
MudahMari bangun sistem peminjaman untuk proyek Manajemen Perpustakaan kita! Kamu akan membuat struct Library yang mengelola koleksi buku dan pengguna, dengan method untuk menangani operasi peminjaman dan pengembalian, lengkap dengan validasi yang tepat.
Kamu akan mengatur kodemu dalam empat file:
book.go: StructBookdari pelajaran sebelumnya, dengan fieldID,Title,Author,ISBN, danAvailable. Sertakan konstruktorNewBookyang menginisialisasi buku agar tersedia.user.go: StructUserdenganID,Name,Email, danBorrowedBooks(slice berisi ID buku). Sertakan konstruktorNewUseryang menginisialisasi pengguna dengan daftar pinjaman kosong.library.go: Buat structLibraryyang menyimpan buku dan pengguna dalam map (dengan ID sebagai kunci). Buat komponen berikut:- Konstruktor
NewLibraryyang menginisialisasi map kosong untuk buku dan pengguna - Method
AddBookyang menambahkan buku ke library - Method
AddUseryang menambahkan pengguna ke library - Method
Borrowyang menerima ID pengguna dan ID buku, memvalidasi operasi, menandai buku sebagai tidak tersedia, menambahkan ID buku ke daftar pinjaman pengguna, dan mengembalikan error jika terjadi masalah - Method
Returnyang membalikkan proses peminjaman: menandai buku sebagai tersedia dan menghapusnya dari daftar pinjaman pengguna
Method
Borrow-mu harus mengembalikan error berikut:user not foundjika ID pengguna tidak ditemukanbook not foundjika ID buku tidak ditemukanbook not availablejika buku sudah dipinjam
Method
Return-mu harus mengembalikan error berikut:user not foundjika ID pengguna tidak ditemukanbook not foundjika ID buku tidak ditemukanbook not borrowedjika buku sudah tersedia
- Konstruktor
main.go: Satukan semuanya dengan membuat library, menambahkan buku dan pengguna, lalu memproses operasi peminjaman dan pengembalian.Baca jumlah buku, lalu baca ID, judul, penulis, dan ISBN setiap buku. Berikutnya, baca jumlah pengguna, lalu baca ID, nama, dan email setiap pengguna. Kemudian baca jumlah operasi, dengan setiap operasi berupa
borrow [userID] [bookID]ataureturn [userID] [bookID].Untuk setiap operasi, cetak
OKjika berhasil, atauError: [message]jika gagal.
Input yang diberikan adalah:
- Jumlah buku, lalu ID, judul, penulis, dan ISBN setiap buku, masing-masing pada baris terpisah
- Jumlah pengguna, lalu ID, nama, dan email setiap pengguna, masing-masing pada baris terpisah
- Jumlah operasi, lalu setiap operasi pada baris terpisah
Contohnya, jika diberikan:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com
4
borrow U001 B001
borrow U001 B001
return U001 B001
borrow U002 B001Outputmu seharusnya:
OK
Error: book not available
OK
Error: user not foundDan jika diberikan:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com
3
borrow U001 B100
borrow U002 B100
return U001 B100Outputmu seharusnya:
OK
Error: book not available
OKDan jika diberikan:
1
B001
Go in Action
William Kennedy
978-1617291784
1
U001
Dave Miller
dave@test.com
2
return U001 B001
borrow U001 B999Outputmu seharusnya:
Error: book not borrowed
Error: book not foundPerhatikan bahwa Library bertindak sebagai koordinator utama. Library memvalidasi semua operasi sebelum mengubah status, sehingga buku dan pengguna tetap tersinkron. Penggunaan pointer receiver memungkinkan method-mu mengubah data sebenarnya yang disimpan di dalam map!
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca jumlah buku
var numBooks int
fmt.Fscanln(reader, &numBooks)
// TODO: Buat library baru
// TODO: Baca detail setiap buku (ID, Title, Author, ISBN pada baris terpisah)
// dan tambahkan ke library
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
isbn, _ := reader.ReadString('\n')
isbn = strings.TrimSpace(isbn)
// TODO: Buat buku dan tambahkan ke library
}
// Baca jumlah pengguna
var numUsers int
fmt.Fscanln(reader, &numUsers)
// TODO: Baca detail setiap pengguna (ID, Name, Email pada baris terpisah)
// dan tambahkan ke library
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: Buat pengguna dan tambahkan ke library
}
// Baca jumlah operasi
var numOps int
fmt.Fscanln(reader, &numOps)
// TODO: Proses setiap operasi
// Format: "borrow [userID] [bookID]" atau "return [userID] [bookID]"
for i := 0; i < numOps; i++ {
line, _ := reader.ReadString('\n')
line = strings.TrimSpace(line)
parts := strings.Split(line, " ")
// TODO: Uraikan operasi dan panggil method yang sesuai
// Cetak "OK" jika berhasil atau "Error: [message]" jika gagal
}
}
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker Pool12Konsep OOP Lanjutan
Pola Opsi FungsionalPola Builder di GoMethod ChainingAlias Tipe vs DefinisiDasar-Dasar ReflectionGambaran Umum Pembuatan Kode15Proyek: Manajemen Library
Ikhtisar dan Struktur ProyekStruct Buku dan PenggunaLatihan sendiri: Compiler Go online