c# - 简单场景,如何融入Tell Don't Ask?

标签 c# tell-dont-ask

我正在尝试对涉及一个人和一个座位的基本场景进行建模。 Person 有一个 Status 属性:Sitting 或 Standing。一个座位有一个 Seated 属性,该属性指定当前坐在其中的 Person。此外,座位特殊因为它只“接受”某些人坐在里面。我知道席位“接受”某人听起来很奇怪,但想象一下它更喜欢某些人而不是其他人。

按照“Tell, Don't Ask”,我应该如何设计Person 和Seat 对象,以便只有当Seat“接受”他并将他的状态更改为Sitting 时,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;
    }
}

不过这还是需要本座改变此人的身份。这是应该更新此人状态的方式吗?只有一个人才能改变他的状态吗?您将如何为这个简单场景建模?

最佳答案

引入第三个模型......同时引用座位和人的座位。然后你可以在每次有人坐下时创建该模型的一个实例,进行一些验证以防止两个人坐在同一个座位上,甚至可以进行一些超时(如果你坐在一个座位上太久,你就会失去它) .

关于c# - 简单场景,如何融入Tell Don't Ask?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/392668/

相关文章:

javascript - 服务器端的 onclick 事件 html 按钮

c# - GetDC(0&) 是什么意思?

oop - 告诉,不要问和单一职责——在类里面用数据做新的事情

java - 如何在 "tell, don' 中进行单元测试并询问“追随者类?”

c# - Visual Studio 2012 : Switch from debug to realease easily

c# - Win32 笔模拟不适用于 InjectTouchInput()

oop - 单一职责 (SRP) 与告诉不要问 (TDA)?

c# - 如何在 .net 中获取进程的用户名或所有者

oop - 工厂模式是否违反了 "Tell, Don' t Ask”原则?