简单的场景,如何合并告诉不要问?

sna*_*zer 5 c# tell-dont-ask

我正在尝试模拟涉及人员和座位的基本场景.人具有身份属性:坐着或站立.一个席位有一个Seated属性,用于指定当前位于其中的Person.此外,座位特别之处在于它只"接受"某些人坐在其中.我知道座位"接受"某人听起来很奇怪,但只是想象它更喜欢某些人而不是其他人.

在" 告诉,不要问 "之后,我应该如何设计Person和Seat对象,以便只有当Seat"接受"他并且他的状态改为Sitting时,Person才能坐在座位上.我的第一个想法是一个Person应该有一个SitDown方法如下:

Person.SitDown(Seat seat);
Run Code Online (Sandbox Code Playgroud)

但这似乎需要Person类在坐在其中之前检查Seat的状态,以及必须更新Seat的Seated属性(而不是更新属性本身的Seat):

// inside the Person class
void SitDown(Seat seat) {
    if (seat.AcceptsPlayer(this)) {
        seat.Seated = this;
        this.Status = Sitting;
    }
}
Run Code Online (Sandbox Code Playgroud)

让Seat类处理一个人似乎更好:

Seat.SeatPerson(Person person);

// inside Seat class
void SeatPerson(Person person) {
    if (IsAccepted(person)) {
        this.Seated = person;
        person.Status = Sitting;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这仍然要求座位改变此人的身份.这是该人的状态应该更新的方式吗?只有一个人能够改变他的身份吗?你会如何模拟这个简单的场景?

小智 4

引入第三个模型……既涉及座位又涉及人员的座位。然后,您可以在每次有人坐下时创建该模型的实例,添加一些验证以防止两个人坐在同一个座位上,甚至可能添加一些超时(如果您坐在座位上的时间太长,您就会失去它) 。