Gast dtechnology.de Geschrieben 10. Juni 2022 Geschrieben 10. Juni 2022 (bearbeitet) Guten Tag, folgendes Problem: Es geht um eine kleine Aufgabe, bei der es Hotels, Zimmer und Personen gibt. Ich möchte prüfen, ob eine Person schon in einem Zimmer ist (Methode: hasPerson). Falls es zu dem Zimmer schon eine Person gibt, soll diese zurückgegeben werden, falls es noch keine Person gibt, soll die übergebene Person gesetzt werden (mit getter und setter; die Überprüfung soll nicht zusätzlich als boolean erfolgen...) Wie überprüfe ich, ob schon irgendeine Person dem Zimmer übergeben wurde. public class Zimmer { private int zimmernr; Person person; // Getter public int getZimmernr() { return this.zimmernr; } public Person getPerson() { return this.person; } // Setter public void setZimmernr(int zimmernr) { this.zimmernr = zimmernr; } public void setPerson(Person p) { this.person = p; } // Methode hasPerson: Zimmer belegt? public Person hasPerson(Person p) { } // Konstruktor public Zimmer(int zimmernr) { this.zimmernr = zimmernr; } public Zimmer(int zimmernr, Person p) { this.zimmernr = zimmernr; this.person = p; } } Bearbeitet 10. Juni 2022 von dtechnology.de Zitieren
0x00 Geschrieben 10. Juni 2022 Geschrieben 10. Juni 2022 Was ist denn Person bevor du sie setzt? Wenn du das weißt kannst du darauf überprüfen Den Namen "hasPerson" finde ich im Übrigen unglücklich gewählt da er eben doch den return eines boolean impliziert. Besser wäre "setPersonIfNotExists" oder so ähnlich. Zitieren
Whiz-zarD Geschrieben 10. Juni 2022 Geschrieben 10. Juni 2022 Schaue dir mal das "Tell-Don't-Ask"-Prinzip an. Eigentlich versuchst du jetzt Logik nach Außen zu verlegen. Derjenige, der die Zimmerbuchung implementiert, muss wissen, dass er nicht den Setter verwenden darf, sondern deine hasPerson()-Methode, um nicht fälschlicherweise eine Fehlbuchung zu risikieren. Der Setter umgeht ja komplett die Logik. vor 42 Minuten schrieb 0x00: Den Namen "hasPerson" finde ich im Übrigen unglücklich gewählt da er eben doch den return eines boolean impliziert. Eigentlich schlimmer noch. Der Parameter, der der Methode übergeben wird, impliziert, dass geschaut wird, ob diese Person im Zimmer übernachtet. 0x00 reagierte darauf 1 Zitieren
Gast dtechnology.de Geschrieben 10. Juni 2022 Geschrieben 10. Juni 2022 Also ich wollte eine Person übergeben, falls das Zimmer schon eine Person hat, soll diese zurückgegeben werden, falls es noch keine Person hat, soll die übergebene Person gesetzt werden. Kann man den Konstruktor irgendwie dazu benutzen?Pseudocode:public Person hasPerson(Person p){if(schon eine Person dem Zimmer zugeordnet){getPerson} else (wenn noch keine Person dem Zimmer zugeordnet){ p.setPerson} Zitieren
Whiz-zarD Geschrieben 10. Juni 2022 Geschrieben 10. Juni 2022 Welchen Zustand hat denn die Klassenvariable person, wenn man ihr noch keinen Wert zugewiesen hat? 0x00 reagierte darauf 1 Zitieren
0x00 Geschrieben 10. Juni 2022 Geschrieben 10. Juni 2022 Und wenn du nicht herausfindest welcher Wert das ist wirf mal den Debugger an Zitieren
Gast dtechnology.de Geschrieben 10. Juni 2022 Geschrieben 10. Juni 2022 Ist der Zustand dann nicht null, da ja nicht zwingend eine Person am Zimmer hängt? Wie könnte ich das am einfachsten lösen? Hier auch nochmal die Klasse Person: public class Person { private String vorname, nachname, email; // Getter public String getVorname() { return this.vorname; } public String getNachname() { return this.nachname; } public String getEmail() { return this.email; } // Setter public void setVorname(String vorname) { this.vorname = vorname; } public void setNachname(String nachname) { this.nachname = nachname; } public void setEmail(String email) { this.email = email; } // Konstruktor public Person(String vorname, String nachname, String email) { this.vorname = vorname; this.nachname = nachname; this.email = email; } } Zitieren
Whiz-zarD Geschrieben 10. Juni 2022 Geschrieben 10. Juni 2022 vor 1 Stunde schrieb dtechnology.de: Ist der Zustand dann nicht null, da ja nicht zwingend eine Person am Zimmer hängt? Richtig. Also wie muss dann die Logik lauten, wenn du der Klassenvariable nur einen Wert zuweisen darfst, wenn die Klassenvariable null ist? Zitieren
Gast dtechnology.de Geschrieben 10. Juni 2022 Geschrieben 10. Juni 2022 Müsste dann if(this.person == null){ p.setPerson()} else{ this.person.getPerson()}gehen?Sorry, aber ich steh grad bisschen auf dem Schlauch Zitieren
Whiz-zarD Geschrieben 11. Juni 2022 Geschrieben 11. Juni 2022 Nicht ganz aber geht schon in die richtige Richtung. getPerson() hängt ja nicht an der Person-Klasse, sondern an der Zimmer-Klasse. Außerdem hat hasPerson() hat einen Rückgabewert, der bei dir fehlt. public Person hasPerson(Person p) { if(this.getPerson() == null) this.setPerson(p); return this.getPerson(); } Wenn noch keine Person gesetzt wurde (also this.getPerson() gibt null zurück), dann setzen wir die Person und geben dann die Person zurück, die für das Zimmer gesetzt wurde. Beim zweiten Aufruf der Methode wird das Setzen übersprungen, weil getPerson() uns eine Person zurückgibt und somit ungleich null ist. Zitieren
Gast dtechnology.de Geschrieben 11. Juni 2022 Geschrieben 11. Juni 2022 Vielen vielen Dank Jetzt leuchtets bei mir ein, bin da einfach nicht drauf gekommen Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.