Menu
Coddy logo textTech

Interface'ler ile Arama

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 101 / 107.

challenge icon

Görev

Kolay

Kütüphane Yönetim Sistemimize esnek arama özellikleri ekleyelim! Kullanıcıların çekirdek kütüphane kodunu değiştirmeden farklı kriterlere göre kitap aramasına olanak tanıyan, arayüzleri (interfaces) kullanarak Strateji (Strategy) desenini uygulayacaksınız.

Kodunuzu beş dosya halinde düzenleyeceksiniz:

  • book.go: Önceki derslerden ID, Title, Author, ISBN ve Available alanlarına sahip Book yapınız. NewBook yapılandırıcısını (constructor) dahil edin.
  • user.go: ID, Name, Email ve BorrowedBooks alanlarına sahip User yapınız. NewUser yapılandırıcısını dahil edin.
  • search.go: Arama stratejisi arayüzünüzü ve uygulamalarını tanımlayın.

    Tek bir metoda sahip bir SearchStrategy arayü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 harf duyarsız)
    • AuthorSearch — kitabın yazarı sorguyu içeriyorsa eşleşir (büyük/küçük harf duyarsız)
    • ISBNSearch — kitabın ISBN'i sorguya tam olarak eşitse eşleşir
  • library.go: Kitaplar ve kullanıcılar için map'ler içeren Library yapınız. Herhangi bir SearchStrategy ve bir sorgu dizesi kabul eden, eşleşen kitap işaretçilerinden (pointers) oluşan bir dilim (slice) döndüren bir Search metodu ekleyin. Metot tüm kitapları dolaşmalı ve sonuçları bulmak için stratejinin Match metodunu kullanmalıdır.
  • main.go: Kitaplarla bir kütüphane oluşturun, ardından farklı stratejiler kullanarak aramalar yapın.

    Kitap sayısını okuyun, ardından her kitap için ID, başlık, yazar ve ISBN bilgilerini okuyun. Sonra, arama işlemi sayısını okuyun. Her işlem bir arama türü (title, author veya isbn) ve ardından sorgu dizesinden oluşur.

    Her arama için, Search by [type]: [query] yazdırın ve bir sonraki satırda eşleşen kitap ID'lerini virgülle ayırarak yazdırın. Hiçbir kitap eşleşmezse, bunun yerine No results yazdırın.

Aşağıdaki girdiler sağlanacaktır:

  • Kitap sayısı, ardından her kitabın ID'si, başlığı, yazarı, ISBN'i (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 şöyle olmalıdır:

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

Ve ş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 şöyle olmalıdır:

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

Ve ş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 şöyle olmalıdır:

Search by title: design
B001,B002

Search metodunun herhangi bir stratejiyle nasıl çalıştığına dikkat edin; başlığa, yazara veya ISBN'e göre arama yapıp yapmadığını bilmez. Bu polimorfik yaklaşım, sadece SearchStrategy arayüzünü uygulayan yeni yapılar oluşturarak yeni arama türleri (müsaitlik durumuna veya yayın yılına göre arama yapmak gibi) 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 bir 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 bir 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çin
		// searchType "title", "author" veya "isbn" olabilir
		var strategy SearchStrategy

		// TODO: Strateji seçim mantığını buraya uygulayın

		// TODO: library.Search(strategy, query) kullanarak aramayı gerçekleştirin

		// TODO: Sonuçları istenen formatta yazdırın
		// Format: "Search by [type]: [query]" ve 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 veya "No results" yazdırın
		_ = strategy // Çözümü uyguladığınızda bu satırı kaldırın
	}
}

Nesne Yönelimli Programlama bölümündeki tüm dersler