Pencarian dengan Interface
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 101 dari 107.
Tantangan
MudahMari tambahkan kemampuan pencarian yang fleksibel ke Sistem Manajemen Perpustakaan kita! Kamu akan menerapkan pola Strategy menggunakan interface, sehingga pengguna dapat mencari buku berdasarkan kriteria yang berbeda tanpa mengubah kode inti library.
Kamu akan mengatur kodemu dalam lima file:
book.go: StructBookdari pelajaran sebelumnya, dengan fieldID,Title,Author,ISBN, danAvailable. Sertakan constructorNewBook.user.go: StructUserdengan fieldID,Name,Email, danBorrowedBooks. Sertakan constructorNewUser.search.go: Definisikan interface strategi pencarian dan implementasinya.Buat interface
SearchStrategydengan satu method:Match(book *Book, query string) boolTerapkan tiga strategi pencarian:
TitleSearch: cocok jika judul buku memuat query (tidak membedakan huruf besar dan kecil)AuthorSearch: cocok jika nama penulis buku memuat query (tidak membedakan huruf besar dan kecil)ISBNSearch: cocok jika ISBN buku sama persis dengan query
library.go: StructLibrarydengan map untuk buku dan pengguna. Tambahkan methodSearchyang menerimaSearchStrategyapa pun dan string query, lalu mengembalikan slice berisi pointer ke buku yang cocok. Method ini harus melakukan iterasi pada semua buku dan menggunakan methodMatchdari strategi untuk menemukan hasil.main.go: Buat library berisi buku, lalu lakukan pencarian menggunakan strategi yang berbeda.Baca jumlah buku, lalu untuk setiap buku baca ID, judul, penulis, dan ISBN-nya. Selanjutnya, baca jumlah operasi pencarian. Setiap operasi terdiri dari jenis pencarian (
title,author, atauisbn) yang diikuti string query.Untuk setiap pencarian, cetak
Search by [type]: [query], lalu ID buku yang cocok pada baris berikutnya, diurutkan secara menaik dan dipisahkan dengan koma (map melakukan iterasi dalam urutan acak, jadi urutkan ID sebelum mencetaknya). Jika tidak ada buku yang cocok, cetakNo results.
Input yang diberikan:
- Jumlah buku, lalu ID, judul, penulis, dan ISBN setiap buku (masing-masing pada baris terpisah)
- Jumlah pencarian, lalu jenis pencarian dan query untuk setiap pencarian (masing-masing pada baris terpisah)
Contohnya, jika diberikan:
3
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Go in Action
William Kennedy
978-1617291784
B003
Learning Python
Mark Lutz
978-1449355739
3
title
go
author
kennedy
isbn
978-1449355739Outputmu seharusnya:
Search by title: go
B001,B002
Search by author: kennedy
B002
Search by isbn: 978-1449355739
B003Jika diberikan:
2
B001
Clean Code
Robert Martin
978-0132350884
B002
The Pragmatic Programmer
David Thomas
978-0135957059
2
title
java
author
martinOutputmu seharusnya:
Search by title: java
No results
Search by author: martin
B001Jika diberikan:
2
B001
Design Patterns
Gang of Four
978-0201633610
B002
Head First Design Patterns
Eric Freeman
978-0596007126
1
title
designOutputmu seharusnya:
Search by title: design
B001,B002Perhatikan cara kerja method Search dengan strategi apa pun. Method ini tidak tahu apakah pencarian dilakukan berdasarkan judul, penulis, atau ISBN. Pendekatan polimorfik ini memungkinkanmu menambahkan jenis pencarian baru (seperti pencarian berdasarkan ketersediaan atau tahun terbit) cukup dengan membuat struct baru yang mengimplementasikan SearchStrategy!
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca jumlah buku
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// Buat library
library := NewLibrary()
// Baca detail setiap buku
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)
book := NewBook(id, title, author, isbn)
library.AddBook(book)
}
// Baca jumlah pencarian
numSearchesStr, _ := reader.ReadString('\n')
numSearches, _ := strconv.Atoi(strings.TrimSpace(numSearchesStr))
// Proses setiap pencarian
for i := 0; i < numSearches; i++ {
searchType, _ := reader.ReadString('\n')
searchType = strings.TrimSpace(searchType)
query, _ := reader.ReadString('\n')
query = strings.TrimSpace(query)
// TODO: Pilih strategi pencarian yang sesuai berdasarkan searchType
// searchType dapat berupa "title", "author", atau "isbn"
var strategy SearchStrategy
// TODO: Terapkan logika pemilihan strategi di sini
// TODO: Lakukan pencarian menggunakan library.Search(strategy, query)
// TODO: Cetak hasil dalam format yang diminta
// Format: "Search by [type]: [query]" diikuti ID yang cocok atau "No results"
fmt.Printf("Search by %s: %s\n", searchType, query)
// TODO: Cetak ID buku yang cocok, pisahkan dengan koma, atau cetak "No results"
_ = strategy // Hapus baris ini saat kamu menerapkan solusi
}
}
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