Ich versuche ein Basisszenario mit einer Person und einem Sitz zu modellieren. Eine Person hat eine Statuseigenschaft: Sitzen oder Stehen. Ein Sitz verfügt über eine sitzende Eigenschaft, die die Person angibt, die gerade darin sitzt. Auch ist ein Sitzplatz spezielle in dem es nur bestimmte Leute "akzeptiert", um darin zu sitzen. Ich weiß, dass es seltsam klingt, wenn ein Seat jemanden "akzeptiert", aber stellen Sie sich einfach vor, dass es bestimmte Leute anderen vorzieht.Einfaches Szenario, wie man sich einbindet, fragen Sie nicht?
Nach "Tell, Don't Ask," Wie soll ich die Objekte Person und Seat so gestalten, dass sich eine Person nur dann auf einem Sitz setzen kann, wenn der Sitz ihn "akzeptiert" und auch ihren Status auf Sitzend geändert hat. Mein erster Gedanke war, dass eine Person sollte eine SitDown Methode haben wie folgt:
Person.SitDown(Seat seat);
Aber das scheint, wie es die Klasse Person erfordern würde, um den Zustand des Sitzes zu kontrollieren, bevor in ihm sitzt, sowie mit aktualisieren der Sitz Eigenschaft Sitz (statt des Seat Aktualisieren der Eigenschaft selbst):
// inside the Person class
void SitDown(Seat seat) {
if (seat.AcceptsPlayer(this)) {
seat.Seated = this;
this.Status = Sitting;
}
}
Es ist besser, scheint die Sitzklasse Griff Sitz eine Person zu haben:
Seat.SeatPerson(Person person);
// inside Seat class
void SeatPerson(Person person) {
if (IsAccepted(person)) {
this.Seated = person;
person.Status = Sitting;
}
}
Dies erfordert jedoch weiterhin, dass der Sitz den Status der Person ändert. Soll der Status der Person aktualisiert werden? Sollte nur eine Person in der Lage sein, ihren Status zu ändern? Wie würden Sie dieses einfache Szenario modellieren?
Können Sie ein Codebeispiel angeben? Ich habe Schwierigkeiten zu verstehen, wie sich der Status einer Person von Stehend zu Sitzen ändert, indem Sie das von Ihnen angegebene Seatings-Modell verwenden. – snazzer
Anstelle eines Status-Flags als Membervariable verfügt die Person über eine IsSeated() -Methode, die das Seatings-Modell überprüft. Ebenso würde der Seat eine IsOccupied() -Methode haben. –