Menu
CoddyTech

Pencarian dengan Interface

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 101 dari 107.

challenge icon

Tantangan

Mudah

Mari 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: Struct Book dari pelajaran sebelumnya, dengan field ID, Title, Author, ISBN, dan Available. Sertakan constructor NewBook.
  • user.go: Struct User dengan field ID, Name, Email, dan BorrowedBooks. Sertakan constructor NewUser.
  • search.go: Definisikan interface strategi pencarian dan implementasinya.

    Buat interface SearchStrategy dengan satu method:

    Match(book *Book, query string) bool

    Terapkan 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: Struct Library dengan map untuk buku dan pengguna. Tambahkan method Search yang menerima SearchStrategy apa pun dan string query, lalu mengembalikan slice berisi pointer ke buku yang cocok. Method ini harus melakukan iterasi pada semua buku dan menggunakan method Match dari 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, atau isbn) 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, cetak No 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-1449355739

Outputmu seharusnya:

Search by title: go
B001,B002
Search by author: kennedy
B002
Search by isbn: 978-1449355739
B003

Jika diberikan:

2
B001
Clean Code
Robert Martin
978-0132350884
B002
The Pragmatic Programmer
David Thomas
978-0135957059
2
title
java
author
martin

Outputmu seharusnya:

Search by title: java
No results
Search by author: martin
B001

Jika diberikan:

2
B001
Design Patterns
Gang of Four
978-0201633610
B002
Head First Design Patterns
Eric Freeman
978-0596007126
1
title
design

Outputmu seharusnya:

Search by title: design
B001,B002

Perhatikan 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

Latihan sendiri: Compiler Go online