Menu
Coddy logo textTech

Ausleihsystem

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

challenge icon

Aufgabe

Einfach

Lass uns das Ausleihsystem für unser Bibliotheksverwaltungsprojekt bauen! Du wirst eine Library-Struktur erstellen, die Sammlungen von Büchern und Benutzern verwaltet, mit Methoden zur Abwicklung von Ausleih- und Rückgabevorgängen – inklusive ordnungsgemäßer Validierung.

Du wirst deinen Code auf vier Dateien verteilen:

  • book.go: Deine Book-Struktur aus der vorherigen Lektion mit den Feldern ID, Title, Author, ISBN und Available. Füge den NewBook-Konstruktor hinzu, der Bücher als verfügbar initialisiert.
  • user.go: Deine User-Struktur mit ID, Name, Email und BorrowedBooks (ein Slice von Buch-IDs). Füge den NewUser-Konstruktor hinzu, der Benutzer mit einer leeren Ausleihliste initialisiert.
  • library.go: Erstelle eine Library-Struktur, die Bücher und Benutzer in Maps speichert (mit ihren IDs als Schlüssel). Baue diese Komponenten:
    • Einen NewLibrary-Konstruktor, der leere Maps für Bücher und Benutzer initialisiert
    • Eine AddBook-Methode, die ein Buch zur Bibliothek hinzufügt
    • Eine AddUser-Methode, die einen Benutzer zur Bibliothek hinzufügt
    • Eine Borrow-Methode, die eine Benutzer-ID und eine Buch-ID entgegennimmt, den Vorgang validiert, das Buch als nicht verfügbar markiert, die Buch-ID zur Ausleihliste des Benutzers hinzufügt und einen Fehler zurückgibt, falls etwas schiefgeht
    • Eine Return-Methode, die den Ausleihvorgang umkehrt – das Buch als verfügbar markiert und es aus der Ausleihliste des Benutzers entfernt

    Deine Borrow-Methode sollte diese Fehler zurückgeben:

    • user not found, wenn die Benutzer-ID nicht existiert
    • book not found, wenn die Buch-ID nicht existiert
    • book not available, wenn das Buch bereits ausgeliehen ist

    Deine Return-Methode sollte diese Fehler zurückgeben:

    • user not found, wenn die Benutzer-ID nicht existiert
    • book not found, wenn die Buch-ID nicht existiert
    • book not borrowed, wenn das Buch bereits verfügbar ist
  • main.go: Führe alles zusammen, indem du eine Bibliothek erstellst, Bücher und Benutzer hinzufügst und dann Ausleih-/Rückgabevorgänge verarbeitest.

    Lies die Anzahl der Bücher ein, dann für jedes Buch seine ID, den Titel, den Autor und die ISBN. Lies als Nächstes die Anzahl der Benutzer ein und für jeden Benutzer seine ID, den Namen und die E-Mail. Lies dann die Anzahl der Operationen ein, wobei jede Operation entweder borrow [userID] [bookID] oder return [userID] [bookID] ist.

    Gib für jede Operation entweder OK bei Erfolg oder Error: [message] bei einem Fehler aus.

Die folgenden Eingaben werden bereitgestellt:

  • Anzahl der Bücher, dann die ID, der Titel, der Autor und die ISBN jedes Buches (jeweils in separaten Zeilen)
  • Anzahl der Benutzer, dann die ID, der Name und die E-Mail jedes Benutzers (jeweils in separaten Zeilen)
  • Anzahl der Operationen, dann jede Operation in einer separaten Zeile

Zum Beispiel, gegeben:

2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com
4
borrow U001 B001
borrow U001 B001
return U001 B001
borrow U002 B001

Deine Ausgabe sollte sein:

OK
Error: book not available
OK
Error: user not found

Und gegeben:

1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com
3
borrow U001 B100
borrow U002 B100
return U001 B100

Deine Ausgabe sollte sein:

OK
Error: book not available
OK

Und gegeben:

1
B001
Go in Action
William Kennedy
978-1617291784
1
U001
Dave Miller
dave@test.com
2
return U001 B001
borrow U001 B999

Deine Ausgabe sollte sein:

Error: book not borrowed
Error: book not found

Beachte, wie die Library als zentraler Koordinator fungiert – sie validiert alle Operationen, bevor sie den Zustand ändert, und stellt sicher, dass Bücher und Benutzer synchron bleiben. Die Verwendung von Pointer-Receivern ermöglicht es deinen Methoden, die tatsächlich in den Maps gespeicherten Daten zu ändern!

Probier es selbst

package main

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

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

	// Anzahl der Bücher lesen
	var numBooks int
	fmt.Scanln(&numBooks)

	// TODO: Eine neue Bibliothek erstellen

	// TODO: Details jedes Buches lesen (ID, Title, Author, ISBN in separaten Zeilen)
	// und sie der Bibliothek hinzufügen
	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)

		// TODO: Buch erstellen und zur Bibliothek hinzufügen
	}

	// Anzahl der Benutzer lesen
	var numUsers int
	fmt.Scanln(&numUsers)

	// TODO: Details jedes Benutzers lesen (ID, Name, Email in separaten Zeilen)
	// und sie der Bibliothek hinzufügen
	for i := 0; i < numUsers; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		name, _ := reader.ReadString('\n')
		name = strings.TrimSpace(name)
		email, _ := reader.ReadString('\n')
		email = strings.TrimSpace(email)

		// TODO: Benutzer erstellen und zur Bibliothek hinzufügen
	}

	// Anzahl der Operationen lesen
	var numOps int
	fmt.Scanln(&numOps)

	// TODO: Jede Operation verarbeiten
	// Format: "borrow [userID] [bookID]" oder "return [userID] [bookID]"
	for i := 0; i < numOps; i++ {
		line, _ := reader.ReadString('\n')
		line = strings.TrimSpace(line)
		parts := strings.Split(line, " ")

		// TODO: Die Operation parsen und die entsprechende Methode aufrufen
		// Gibt "OK" bei Erfolg oder "Error: [message]" bei Fehler aus
	}
}

Alle Lektionen in Objektorientierte Programmierung