173 lines
6.9 KiB
Plaintext
173 lines
6.9 KiB
Plaintext
prompt 4:
|
|
|
|
ich: implementiere einen weiteren punkt in die ui, der eine manuelle systemdatumänderung erlaubt,
|
|
um die rückgabe mit gebührenkonto ausprobieren zu können. Hier ist die UI Klasse (Eingabe von UI Klasse)
|
|
|
|
AI:Um eine manuelle Änderung des Systemdatums in der Benutzeroberfläche zu ermöglichen, müssen folgende Schritte durchgeführt werden:
|
|
|
|
1. Hinzufügen eines Systemdatums
|
|
Ein globales Systemdatum wird hinzugefügt, das in der gesamten Anwendung verwendet wird. Dies ermöglicht es, das Datum manuell zu ändern.
|
|
|
|
Hinzufügen zur LibrarySystem-Klasse
|
|
java
|
|
Copy code
|
|
import java.util.Calendar;
|
|
import java.util.Date;
|
|
|
|
public class LibrarySystem {
|
|
private Date currentDate;
|
|
|
|
public LibrarySystem() {
|
|
this.currentDate = new Date(); // Standardmäßig aktuelles Datum
|
|
}
|
|
|
|
public Date getCurrentDate() {
|
|
return currentDate;
|
|
}
|
|
|
|
public void setCurrentDate(Date date) {
|
|
this.currentDate = date;
|
|
System.out.println("Systemdatum erfolgreich auf " + date + " geändert.");
|
|
}
|
|
|
|
public void resetCurrentDate() {
|
|
this.currentDate = new Date();
|
|
System.out.println("Systemdatum auf aktuelles Datum zurückgesetzt: " + currentDate);
|
|
}
|
|
}
|
|
2. Anpassung der Berechnungen
|
|
Die Methoden, die auf das aktuelle Datum angewiesen sind (z. B. Rückgabefristen und Gebührenberechnung), nutzen nun das globale currentDate.
|
|
|
|
Beispiel: returnMedium
|
|
java
|
|
Copy code
|
|
if (currentDate.after(medium.getDueDate())) {
|
|
long overdueDays = (currentDate.getTime() - medium.getDueDate().getTime()) / (1000 * 60 * 60 * 24);
|
|
double fee = calculateOverdueFee(overdueDays);
|
|
borrower.addFee(fee);
|
|
System.out.println("Medium '" + medium.getTitle() + "' wurde erfolgreich zurückgegeben.");
|
|
System.out.println("Überfällige Gebühren für " + borrower.getName() + ": " + fee + " EUR.");
|
|
}
|
|
3. Erweiterung der Benutzeroberfläche
|
|
Eine neue Option wird hinzugefügt, um das Datum manuell zu ändern oder zurückzusetzen.
|
|
|
|
Code für die UI:
|
|
java
|
|
Copy code
|
|
case 7 -> {
|
|
System.out.println("Systemdatum ändern:");
|
|
System.out.println("1. Manuelles Datum setzen");
|
|
System.out.println("2. Datum auf aktuelles zurücksetzen");
|
|
int option = scanner.nextInt();
|
|
|
|
switch (option) {
|
|
case 1 -> {
|
|
System.out.print("Neues Datum eingeben (Format: yyyy-MM-dd): ");
|
|
String dateInput = scanner.next();
|
|
try {
|
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
|
Date newDate = dateFormat.parse(dateInput);
|
|
librarySystem.setCurrentDate(newDate);
|
|
} catch (ParseException e) {
|
|
System.out.println("Ungültiges Datum. Bitte im Format yyyy-MM-dd eingeben.");
|
|
}
|
|
}
|
|
case 2 -> librarySystem.resetCurrentDate();
|
|
default -> System.out.println("Ungültige Option.");
|
|
}
|
|
}
|
|
---------------------------------------------------------------------
|
|
prompt 5:
|
|
|
|
ich: das rückgabeDatum wird bei mir so berechnet, sodass immer das systemdatum verwendet wird. kannst du das so verbessern,
|
|
so dass es auch mit dem manuellen Datum funktioniert? public Date rechneRueckgabedatum(){
|
|
Calendar calendar = Calendar.getInstance();
|
|
calendar.add(Calendar.DAY_OF_YEAR, getAusleihdauer());
|
|
this.rueckgabedatum = calendar.getTime();
|
|
return rueckgabedatum;
|
|
}
|
|
AI:
|
|
Um sicherzustellen, dass die Methode rechneRueckgabedatum mit dem manuellen Systemdatum arbeitet, anstatt immer
|
|
das aktuelle Datum zu verwenden, können wir das globale Systemdatum aus der LibrarySystem-Klasse einbinden.
|
|
Dazu müssen wir das Systemdatum explizit in die Berechnung einfließen lassen.
|
|
|
|
Verbesserte Implementierung der Methode
|
|
java
|
|
Copy code
|
|
public Date rechneRueckgabedatum(Date systemDate) {
|
|
Calendar calendar = Calendar.getInstance();
|
|
calendar.setTime(systemDate); // Verwende das übergebene Systemdatum
|
|
calendar.add(Calendar.DAY_OF_YEAR, getAusleihdauer()); // Füge die Ausleihdauer hinzu
|
|
this.rueckgabedatum = calendar.getTime();
|
|
return rueckgabedatum;
|
|
}
|
|
Anpassung der Aufrufe
|
|
Damit die Methode korrekt funktioniert, muss das Systemdatum beim Aufruf übergeben werden. Beispielsweise:
|
|
|
|
Ausleihe eines Mediums
|
|
Wenn ein Medium ausgeliehen wird, rufst du rechneRueckgabedatum mit dem aktuellen Systemdatum auf:
|
|
|
|
java
|
|
Copy code
|
|
public void leiheMediumAus(Medium medium) {
|
|
if (medium.isLoaned()) {
|
|
System.out.println("Das Medium '" + medium.getTitle() + "' ist bereits ausgeliehen.");
|
|
return;
|
|
}
|
|
|
|
Date rueckgabeDatum = medium.rechneRueckgabedatum(librarySystem.getCurrentDate());
|
|
medium.setLoaned(true);
|
|
medium.setDueDate(rueckgabeDatum);
|
|
System.out.println("Medium '" + medium.getTitle() + "' erfolgreich ausgeliehen.");
|
|
System.out.println("Rückgabedatum: " + rueckgabeDatum);
|
|
}
|
|
Alternative: Systemdatum global bereitstellen
|
|
Falls viele Klassen das Systemdatum verwenden, kannst du es direkt über eine Singleton-Instanz der LibrarySystem-Klasse bereitstellen:
|
|
|
|
Singleton-Pattern für LibrarySystem
|
|
java
|
|
Copy code
|
|
public class LibrarySystem {
|
|
private static LibrarySystem instance;
|
|
private Date currentDate;
|
|
|
|
private LibrarySystem() {
|
|
this.currentDate = new Date();
|
|
}
|
|
|
|
public static LibrarySystem getInstance() {
|
|
if (instance == null) {
|
|
instance = new LibrarySystem();
|
|
}
|
|
return instance;
|
|
}
|
|
|
|
public Date getCurrentDate() {
|
|
return currentDate;
|
|
}
|
|
|
|
public void setCurrentDate(Date date) {
|
|
this.currentDate = date;
|
|
}
|
|
|
|
public void resetCurrentDate() {
|
|
this.currentDate = new Date();
|
|
}
|
|
}
|
|
Aufruf ohne Übergabe des Datums
|
|
Wenn die Methode auf das Singleton zugreifen kann, wird die Übergabe des Datums überflüssig:
|
|
|
|
java
|
|
Copy code
|
|
public Date rechneRueckgabedatum() {
|
|
Calendar calendar = Calendar.getInstance();
|
|
calendar.setTime(LibrarySystem.getInstance().getCurrentDate());
|
|
calendar.add(Calendar.DAY_OF_YEAR, getAusleihdauer());
|
|
this.rueckgabedatum = calendar.getTime();
|
|
return rueckgabedatum;
|
|
}
|
|
Zusammenfassung der Änderungen
|
|
Neue Methode: Die Methode rechneRueckgabedatum akzeptiert jetzt ein systemDate als Parameter.
|
|
Systemweite Änderungen: Das Systemdatum wird durch die LibrarySystem-Klasse verwaltet.
|
|
Globale Verfügbarkeit: Entweder durch explizite Übergabe oder über ein Singleton-Pattern.
|
|
Mit diesen Änderungen passt sich das Rückgabedatum automatisch an das manuelle Systemdatum an. |