Menu
Coddy logo textTech

Ausleihsystem

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

challenge icon

Aufgabe

Einfach

Erstellen wir das Ausleihsystem für unser Bibliotheksverwaltungsprojekt! Du erstellst eine Library-Struktur, die Sammlungen von books und Benutzern verwaltet, mit Methoden zur Verarbeitung von Ausleih- und Rückgabevorgängen: einschließlich einer ordnungsgemäßen Validierung.

Du organisierst deinen Code über vier Dateien:

  • 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 books als verfügbar initialisiert.
  • user.go: Deine User-Struktur mit ID, Name, Email und BorrowedBooks (Slice von Buch-IDs). Füge den NewUser-Konstruktor hinzu, der Benutzer mit einer leeren Ausleihliste initialisiert.
  • library.go: Erstelle eine Library-Struktur, die books und Benutzer in Maps speichert (geordnet nach ihren IDs). Erstelle diese Komponenten:
    • Ein NewLibrary-Konstruktor, der leere Maps für books 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 bei einem Fehler einen Fehler zurückgibt
    • Eine Return-Methode, die den Ausleihvorgang rückgängig macht: Sie markiert das Buch als verfügbar und entfernt es aus der Ausleihliste des Benutzers

    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, books und Benutzer hinzufügst und anschließend Ausleih- und Rückgabevorgänge verarbeitest.

    Lies die Anzahl der books und anschließend für jedes Buch seine ID, seinen Titel, seinen Autor und seine ISBN ein. Lies danach die Anzahl der Benutzer und für jeden Benutzer seine ID, seinen Namen und seine E-Mail-Adresse ein. Lies anschließend die Anzahl der Vorgänge ein, wobei jeder Vorgang entweder borrow [userID] [bookID] oder return [userID] [bookID] ist.

    Gib für jeden Vorgang entweder OK aus, wenn er erfolgreich war, oder Error: [message], wenn er fehlschlägt.

Die folgenden Eingaben werden bereitgestellt:

  • Anzahl der books, anschließend die ID, der Titel, der Autor und die ISBN jedes Buchs (jeweils in einer eigenen Zeile)
  • Anzahl der Benutzer, anschließend die ID, der Name und die E-Mail-Adresse jedes Benutzers (jeweils in einer eigenen Zeile)
  • Anzahl der Vorgänge, anschließend jeder Vorgang in einer eigenen Zeile

Zum Beispiel bei folgender Eingabe:

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

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

Und bei folgender Eingabe:

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

OK
Error: book not available
OK

Und bei folgender Eingabe:

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

Error: book not borrowed
Error: book not found

Beachte, wie die Library als zentrale Koordinatorin fungiert. Sie validiert alle Vorgänge, bevor sie den Zustand verändert, und stellt so sicher, dass books und Benutzer synchron bleiben. Durch die Verwendung von Pointer-Receivern können deine Methoden die tatsächlichen in den Maps gespeicherten Daten verä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.Fscanln(reader, &numBooks)

	// TODO: Eine neue Bibliothek erstellen

	// TODO: Details jedes Buches lesen (ID, Title, Author, ISBN in separaten Zeilen)
	// und sie zur 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.Fscanln(reader, &numUsers)

	// TODO: Details jedes Benutzers lesen (ID, Name, Email in separaten Zeilen)
	// und sie zur 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.Fscanln(reader, &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
		// Gib "OK" bei Erfolg oder "Error: [message]" bei Fehlschlag aus
	}
}

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Go-Compiler