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

Fügen wir unserem Bibliotheksverwaltungssystem flexible Suchfunktionen hinzu! Du wirst das Strategy-Muster mithilfe von Interfaces implementieren, sodass Benutzer nach Büchern anhand verschiedener Kriterien suchen können, ohne den Kerncode der Bibliothek zu verändern.

Du wirst deinen Code auf fünf Dateien aufteilen:

  • book.go: Deine Book-Struktur aus den vorherigen Lektionen mit den Feldern ID, Title, Author, ISBN und Available. Füge den Konstruktor NewBook hinzu.
  • user.go: Deine User-Struktur mit den Feldern ID, Name, Email und BorrowedBooks. Füge den Konstruktor NewUser hinzu.
  • search.go: Definiere dein Suchstrategie-Interface und die Implementierungen.

    Erstelle ein SearchStrategy-Interface mit einer einzigen Methode:

    Match(book *Book, query string) bool

    Implementiere drei Suchstrategien:

    • TitleSearch: stimmt überein, wenn der Titel des Buches die Suchanfrage enthält (ohne Beachtung der Groß- und Kleinschreibung)
    • AuthorSearch: stimmt überein, wenn der Autor des Buches die Suchanfrage enthält (ohne Beachtung der Groß- und Kleinschreibung)
    • ISBNSearch: stimmt überein, wenn die ISBN des Buches genau der Suchanfrage entspricht
  • library.go: Deine Library-Struktur mit Maps für Bücher und Benutzer. Füge eine Search-Methode hinzu, die jede beliebige SearchStrategy und eine Suchanfrage akzeptiert und ein Slice mit Zeigern auf die passenden Bücher zurückgibt. Die Methode soll alle Bücher durchlaufen und die Match-Methode der Strategie verwenden, um Ergebnisse zu finden.
  • main.go: Erstelle eine Bibliothek mit Büchern und führe anschließend Suchen mit verschiedenen Strategien durch.

    Lies die Anzahl der Bücher ein und anschließend für jedes Buch seine ID, seinen Titel, seinen Autor und seine ISBN. Lies danach die Anzahl der Suchvorgänge ein. Jeder Vorgang besteht aus einem Suchtyp (title, author oder isbn), gefolgt von der Suchanfrage.

    Gib für jede Suche Search by [type]: [query] aus, gefolgt von den IDs der passenden Bücher in der nächsten Zeile, aufsteigend sortiert und durch Kommas getrennt (eine Map wird in zufälliger Reihenfolge durchlaufen, daher müssen die IDs vor der Ausgabe sortiert werden). Wenn keine Bücher übereinstimmen, gib stattdessen No results aus.

Die folgenden Eingaben werden bereitgestellt:

  • Anzahl der Bücher, danach die ID, der Titel, der Autor und die ISBN jedes Buches (jeweils in einer eigenen Zeile)
  • Anzahl der Suchen, danach jeweils der Suchtyp und die Suchanfrage (jeweils in einer eigenen Zeile)

Zum Beispiel bei folgender Eingabe:

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 deine Ausgabe folgendermaßen aussehen:

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

Und bei folgender Eingabe:

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

sollte deine Ausgabe folgendermaßen aussehen:

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

Und bei folgender Eingabe:

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

sollte deine Ausgabe folgendermaßen aussehen:

Search by title: design
B001,B002

Beachte, wie die Search-Methode mit jeder Strategie funktioniert. Sie weiß nicht, ob sie nach Titel, Autor oder ISBN sucht. Dieser polymorphe Ansatz bedeutet, dass du neue Suchtypen (wie die Suche nach Verfügbarkeit oder Erscheinungsjahr) einfach hinzufügen kannst, indem du neue Strukturen erstellst, 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 Suchen 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
		// searchType kann "title", "author" oder "isbn" sein
		var strategy SearchStrategy

		// TODO: Implementiere hier die Logik zur Strategiewahl

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

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

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

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Go-Compiler