Interface'ler ile Arama
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 101 / 107.
Görev
KolayKütüphane Yönetim Sistemimize esnek arama özellikleri ekleyelim! Arayüzleri kullanarak Strategy kalıbını uygulayacak ve kullanıcıların temel kütüphane kodunu değiştirmeden farklı ölçütlere göre kitap aramasını sağlayacaksınız.
Kodunuzu beş dosya arasında düzenleyeceksiniz:
book.go: Önceki derslerdekiBook,ID,Title,AuthorveISBNalanlarına sahipAvailableyapınız.NewBookoluşturucusunu ekleyin.user.go:User,ID,NameveEmailalanlarına sahipBorrowedBooksyapınız.NewUseroluşturucusunu ekleyin.search.go: Arama stratejisi arayüzünüzü ve uygulamalarını tanımlayın.Tek bir metoda sahip bir
SearchStrategyarayüzü oluşturun:Match(book *Book, query string) boolÜç arama stratejisi uygulayın:
TitleSearch: kitabın başlığı sorguyu içeriyorsa eşleşir (büyük/küçük harfe duyarsız)AuthorSearch: kitabın yazarı sorguyu içeriyorsa eşleşir (büyük/küçük harfe duyarsız)ISBNSearch: kitabın ISBN'si sorguya tam olarak eşitse eşleşir
library.go: Kitaplar ve kullanıcılar için map'lere sahipLibraryyapınız. Herhangi birSearchve bir sorgu dizesi kabul eden, eşleşen kitap işaretçilerinden oluşan bir dilim döndüren birSearchStrategymetodu ekleyin. Metot tüm kitaplar üzerinde yinelemeli ve sonuçları bulmak için stratejininMatchmetodunu kullanmalıdır.main.go: Kitaplarla bir kütüphane oluşturun, ardından farklı stratejileri kullanarak aramalar gerçekleştirin.Kitap sayısını okuyun, ardından her kitap için kimliğini, başlığını, yazarını ve ISBN'sini okuyun. Sonra arama işlemlerinin sayısını okuyun. Her işlem, ardından sorgu dizesi gelen bir arama türünden (
title,authorveyaisbn) oluşur.Her arama için
Search by [type]: [query]yazdırın; sonraki satırda eşleşen kitap kimliklerini artan sırada ve virgüllerle ayırarak yazdırın (bir map rastgele sırada yinelenir, bu nedenle yazdırmadan önce kimlikleri sıralayın). Hiçbir kitap eşleşmezse bunun yerineNo resultsyazdırın.
Aşağıdaki girdiler sağlanacaktır:
- Kitap sayısı, ardından her kitabın kimliği, başlığı, yazarı ve ISBN'si (her biri ayrı satırlarda)
- Arama sayısı, ardından her arama türü ve sorgusu (her biri ayrı satırlarda)
Örneğin, şu girdi verildiğinde:
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Çıktınız şu şekilde olmalıdır:
Search by title: go
B001,B002
Search by author: kennedy
B002
Search by isbn: 978-1449355739
B003Ve şu girdi verildiğinde:
2
B001
Clean Code
Robert Martin
978-0132350884
B002
The Pragmatic Programmer
David Thomas
978-0135957059
2
title
java
author
martinÇıktınız şu şekilde olmalıdır:
Search by title: java
No results
Search by author: martin
B001Ve şu girdi verildiğinde:
2
B001
Design Patterns
Gang of Four
978-0201633610
B002
Head First Design Patterns
Eric Freeman
978-0596007126
1
title
designÇıktınız şu şekilde olmalıdır:
Search by title: design
B001,B002Search metodunun herhangi bir stratejiyle nasıl çalıştığına dikkat edin. Bu metot başlığa, yazara veya ISBN'ye göre arama yapıp yapmadığını bilmez. Bu polimorfik yaklaşım, SearchStrategy uygulayan yeni yapılar oluşturarak yeni arama türlerini (kullanılabilirliğe veya yayın yılına göre arama gibi) kolayca ekleyebileceğiniz anlamına gelir!
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Kitap sayısını oku
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// Kütüphane oluştur
library := NewLibrary()
// Her kitabın detaylarını oku
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)
}
// Arama sayısını oku
numSearchesStr, _ := reader.ReadString('\n')
numSearches, _ := strconv.Atoi(strings.TrimSpace(numSearchesStr))
// Her aramayı işle
for i := 0; i < numSearches; i++ {
searchType, _ := reader.ReadString('\n')
searchType = strings.TrimSpace(searchType)
query, _ := reader.ReadString('\n')
query = strings.TrimSpace(query)
// TODO: searchType'a göre uygun arama stratejisini seç
// searchType "title", "author" veya "isbn" olabilir
var strategy SearchStrategy
// TODO: Strateji seçim mantığını buraya uygula
// TODO: library.Search(strategy, query) kullanarak aramayı gerçekleştir
// TODO: Sonuçları gerekli formatta yazdır
// Format: "Search by [type]: [query]" ardından eşleşen ID'ler veya "No results"
fmt.Printf("Search by %s: %s\n", searchType, query)
// TODO: Eşleşen kitap ID'lerini virgülle ayırarak yazdır veya "No results"
_ = strategy // Çözümü uyguladığınızda bu satırı kaldırın
}
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool12İleri Düzey OOP Kavramları
Functional Options DeseniGo'da Builder DeseniMetot ZincirlemeTür Takma Adları vs. TanımlamalarReflection TemelleriKod Üretimine Genel Bakış15Proje: Kütüphane Yönetimi
Projeye Genel Bakış ve YapıKitap ve Kullanıcı Struct'larıKendi başına pratik yap: Online Go derleyicisi