Person と Seat を含む基本的なシナリオをモデル化しようとしています。Person には Status プロパティがあります: 座っているか立っているか。座席には、現在座っている人を指定する Seated プロパティがあります。また、Seat は、特定の人のみが座ることができるという点で特別です。座席が誰かを「受け入れる」というのは奇妙に聞こえるかもしれませんが、他の人よりも特定の人を好むと想像してみてください。
「Tell, Don't Ask 」に続いて、Person オブジェクトと Seat オブジェクトをどのように設計すれば、Seat が彼を "受け入れ" たときにのみ、Person が Seat に座ることができ、ステータスが座っている状態に変更されるようにする必要があります。私が最初に考えたのは、 Person には次のように SitDown メソッドが必要だということでした。
Person.SitDown(Seat seat);
しかし、これは Person クラスがシートに座る前にシートの状態を検査する必要があり、シートの Seated プロパティを更新する必要があるようです (プロパティ自体を更新するシートの代わりに):
// inside the Person class
void SitDown(Seat seat) {
if (seat.AcceptsPlayer(this)) {
seat.Seated = this;
this.Status = Sitting;
}
}
Seat クラスに人を着席させる方が良いようです:
Seat.SeatPerson(Person person);
// inside Seat class
void SeatPerson(Person person) {
if (IsAccepted(person)) {
this.Seated = person;
person.Status = Sitting;
}
}
ただし、これにはまだ、Seat が個人のステータスを変更する必要があります。これは、個人のステータスを更新する方法ですか? 個人だけが自分のステータスを変更できるようにする必要がありますか? この単純なシナリオをどのようにモデル化しますか?