Menu
Coddy logo textTech

Suche mit Interfaces

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 101 von 107.

challenge icon

Aufgabe

Einfach

Lassen wir uns flexible Suchfunktionen zu unserem Bibliotheksverwaltungssystem hinzufügen! Sie werden das Strategy-Pattern mithilfe von Interfaces implementieren, was es Benutzern ermöglicht, nach Büchern anhand verschiedener Kriterien zu suchen, ohne den Kerncode der Bibliothek zu ändern.

Sie werden Ihren Code über fünf Dateien organisieren:

  • book.go: Ihr Book-Struct aus den vorherigen Lektionen mit den Feldern ID, Title, Author, ISBN und Available. Fügen Sie den NewBook-Konstruktor hinzu.
  • user.go: Ihr User-Struct mit den Feldern ID, Name, Email und BorrowedBooks. Fügen Sie den NewUser-Konstruktor hinzu.
  • search.go: Definieren Sie Ihr Suchstrategie-Interface und dessen Implementierungen.

    Erstellen Sie ein SearchStrategy-Interface mit einer einzigen Methode:

    Match(book *Book, query string) bool

    Implementieren Sie drei Suchstrategien:

    • TitleSearch — trifft zu, wenn der Titel des Buches die Abfrage enthält (unabhängig von Groß-/Kleinschreibung)
    • AuthorSearch — trifft zu, wenn der Autor des Buches die Abfrage enthält (unabhängig von Groß-/Kleinschreibung)
    • ISBNSearch — trifft zu, wenn die ISBN des Buches exakt der Abfrage entspricht
  • library.go: Ihr Library-Struct mit Maps für Bücher und Benutzer. Fügen Sie eine Search-Methode hinzu, die eine beliebige SearchStrategy und einen Abfragestring (query) akzeptiert und einen Slice von Buch-Pointern zurückgibt. Die Methode sollte alle Bücher durchlaufen und die Match-Methode der Strategie verwenden, um Ergebnisse zu finden.
  • main.go: Erstellen Sie eine Bibliothek mit Büchern und führen Sie dann Suchen mit verschiedenen Strategien durch.

    Lesen Sie die Anzahl der Bücher ein, dann für jedes Buch dessen ID, Titel, Autor und ISBN. Lesen Sie als Nächstes die Anzahl der Suchvorgänge ein. Jeder Vorgang besteht aus einem Suchtyp (title, author oder isbn), gefolgt vom Abfragestring.

    Geben Sie für jede Suche Search by [type]: [query] aus, gefolgt von den passenden Buch-IDs in der nächsten Zeile, getrennt durch Kommas. Wenn keine Bücher übereinstimmen, geben Sie stattdessen No results aus.

Die folgenden Eingaben werden bereitgestellt:

  • Anzahl der Bücher, dann ID, Titel, Autor und ISBN jedes Buches (jeweils in separaten Zeilen)
  • Anzahl der Suchen, dann jeder Suchtyp und die Abfrage (jeweils in separaten Zeilen)

Zum Beispiel, gegeben:

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

Sollte Ihre Ausgabe wie folgt aussehen:

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

Und gegeben:

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

Sollte Ihre Ausgabe wie folgt aussehen:

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

Und gegeben:

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

Sollte Ihre Ausgabe wie folgt aussehen:

Search by title: design
B001,B002

Beachten Sie, wie die Search-Methode mit jeder Strategie funktioniert — sie weiß nicht, ob sie nach Titel, Autor oder ISBN sucht. Dieser polymorphe Ansatz bedeutet, dass Sie neue Suchtypen hinzufügen können (wie die Suche nach Verfügbarkeit oder Erscheinungsjahr), indem Sie einfach neue Structs erstellen, die SearchStrategy implementieren!

Probier es selbst

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Anzahl der Bücher lesen
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// Bibliothek erstellen
	library := NewLibrary()

	// Details jedes Buches lesen
	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)
	}

	// Anzahl der Suchanfragen lesen
	numSearchesStr, _ := reader.ReadString('\n')
	numSearches, _ := strconv.Atoi(strings.TrimSpace(numSearchesStr))

	// Jede Suche verarbeiten
	for i := 0; i < numSearches; i++ {
		searchType, _ := reader.ReadString('\n')
		searchType = strings.TrimSpace(searchType)
		query, _ := reader.ReadString('\n')
		query = strings.TrimSpace(query)

		// TODO: Wähle die passende Suchstrategie basierend auf searchType aus
		// searchType kann "title", "author" oder "isbn" sein
		var strategy SearchStrategy

		// TODO: Implementiere hier die Logik zur Strategieauswahl

		// TODO: Führe die Suche mit library.Search(strategy, query) aus

		// TODO: Gib die Ergebnisse im erforderlichen Format aus
		// Format: "Search by [type]: [query]" gefolgt von passenden IDs oder "No results"
		fmt.Printf("Search by %s: %s\n", searchType, query)

		// TODO: Gib die passenden Buch-IDs durch Kommas getrennt aus, oder "No results"
		_ = strategy // Entferne diese Zeile, wenn du die Lösung implementierst
	}
}

Alle Lektionen in Objektorientierte Programmierung