Estoy tratando de modelar un escenario básico que involucre una Persona y un Asiento. Una persona tiene una propiedad de estado: sentado o de pie. Un asiento tiene una propiedad Sentada que especifica la Persona que se encuentra actualmente en él. Además, un asiento es especial en el sentido de que solo "acepta" a ciertas personas para sentarse en él. Sé que suena extraño que un Asiento "acepte" a alguien, pero imagínese que prefiere a ciertas personas sobre otras.Escenario simple, cómo incorporarlo Tell Do not Ask?
Siguiendo "Tell, Don't Ask," ¿Cómo debo diseñar los objetos Persona y Asiento para que una Persona pueda sentarse en un Asiento solo cuando el Asiento "lo acepte" y también que su estado cambie a Sentado? Mi primer pensamiento fue que una persona debe tener un método de brazos caídos de la siguiente manera:
Person.SitDown(Seat seat);
Pero esto parece que requeriría la clase Person para inspeccionar el estado del asiento antes de sentarse en ella, así como tener que actualizar propiedad asentada del asiento (en lugar del asiento de la actualización de la propiedad en sí):
// inside the Person class
void SitDown(Seat seat) {
if (seat.AcceptsPlayer(this)) {
seat.Seated = this;
this.Status = Sitting;
}
}
parece mejor tener la manija de la clase de asiento del asiento a una persona:
Seat.SeatPerson(Person person);
// inside Seat class
void SeatPerson(Person person) {
if (IsAccepted(person)) {
this.Seated = person;
person.Status = Sitting;
}
}
Pero esto todavía requiere que Seat cambie el estado de la persona. ¿Es esta la manera en que se debe actualizar el estado de la persona? ¿Debería solo una Persona poder cambiar su estado? ¿Cómo modelarías este simple escenario?
¿Puede proporcionar un ejemplo de código? Tengo dificultades para entender cómo cambia el estado de una persona de estar de pie a sentado usando el modelo de los asientos como usted ha especificado. – snazzer
En lugar de tener una bandera de Estado como variable miembro, la Persona tendría un método IsSeated() que verifica el modelo de Seatings. Del mismo modo, el asiento tendría un método IsOccupied(). –