Interface CLI Admin
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 103 dari 107.
Tantangan
MudahMari bangun antarmuka baris perintah untuk Sistem Manajemen Perpustakaan kita menggunakan Command Pattern! Kamu akan membuat CLI yang memproses perintah admin seperti menambahkan buku, mendaftarkan pengguna, dan mengelola peminjaman, semuanya melalui arsitektur yang rapi dan mudah dikembangkan.
Kamu akan mengatur kodemu dalam enam file:
book.go: StructBook-mu dengan tag JSON untukID,Title,Author,ISBN, danAvailable. Sertakan constructorNewBook.user.go: StructUser-mu dengan tag JSON untukID,Name,Email, danBorrowedBooks. Sertakan constructorNewUser.library.go: StructLibrary-mu dengan map untuk buku dan pengguna, beserta methodAddBook,AddUser,Borrow, danReturndari pelajaran sebelumnya.commands.go: Di sinilah Command Pattern mulai digunakan! Definisikan interfaceCommanddengan methodExecuteyang menerima*Librarydan argumen[]string, lalu mengembalikan hasil berupa string. Kemudian, implementasikan struct perintah berikut:AddBookCommand: menerima 4 argumen: id, title, author, isbn. Menambahkan buku dan mengembalikanBook added: [title]AddUserCommand: menerima 3 argumen: id, name, email. Menambahkan pengguna dan mengembalikanUser added: [name]BorrowCommand: menerima 2 argumen: userID, bookID. MengembalikanBorrowed: [bookID]jika berhasil, atauError: [message]jika gagalReturnCommand: menerima 2 argumen: userID, bookID. MengembalikanReturned: [bookID]jika berhasil, atauError: [message]jika gagalListBooksCommand: tidak menerima argumen. Mengembalikan ID dan judul setiap buku pada baris terpisah dengan format[id]: [title], atauNo booksjika kosong (urutkan daftar buku berdasarkan ID)
Jika perintah menerima argumen yang tidak mencukupi, kembalikan
Error: insufficient argumentscli.go: Buat structCLIyang menyimpan pointer keLibrarydan map yang memetakan nama perintah ke implementasiCommand. Buat:- Constructor
NewCLIyang menginisialisasi CLI dengan library dan mendaftarkan semua perintah:addbook,adduser,borrow,return,listbooks - Method
Runyang menerima string input, menguraikannya menggunakanstrings.Fields, mencari perintah, lalu menjalankannya. KembalikanNo command provideduntuk input kosong, atauUnknown command: [name]untuk perintah yang tidak dikenali
- Constructor
main.go: Buat library dan CLI, lalu proses perintah dari input. Baca jumlah perintah, lalu baca setiap string perintah pada baris terpisah. Untuk setiap perintah, panggilRundan cetak hasilnya.
Input berikut akan diberikan:
- Jumlah perintah
- Setiap perintah sebagai string lengkap pada barisnya sendiri
Contohnya, jika diberikan:
6
addbook B001 Go-Programming Alan-Donovan 978-0134190440
addbook B002 Clean-Code Robert-Martin 978-0132350884
adduser U001 Alice alice@test.com
borrow U001 B001
listbooks
borrow U001 B001Output-mu seharusnya:
Book added: Go-Programming
Book added: Clean-Code
User added: Alice
Borrowed: B001
B001: Go-Programming
B002: Clean-Code
Error: book not availableDan jika diberikan:
4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd testOutput-mu seharusnya:
No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmdDan jika diberikan:
5
adduser U001 Bob bob@email.com
borrow U001 B001
addbook B001 Golang-Guide John-Smith 123-456
borrow U001 B001
return U001 B001Output-mu seharusnya:
User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001Perhatikan bahwa CLI tidak perlu mengetahui detail setiap operasi. CLI cukup mencari perintah dan menyerahkan pelaksanaannya. Dengan begitu, menambahkan perintah baru cukup dengan membuat struct baru yang mengimplementasikan interface Command dan mendaftarkannya di CLI!
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// Baca jumlah perintah
var n int
fmt.Scanln(&n)
// Buat scanner untuk membaca baris lengkap
scanner := bufio.NewScanner(os.Stdin)
// TODO: Buat Library baru
// TODO: Buat CLI baru dengan library
// TODO: Proses setiap perintah
// Untuk setiap perintah dari n perintah:
// - Baca baris perintah menggunakan scanner.Scan() dan scanner.Text()
// - Jalankan perintah melalui CLI
// - Cetak hasilnya
_ = scanner // Hapus baris ini saat kamu menggunakan scanner
}
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