作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个门的定义:
class Door
{
public void Lock()
{
// lock the door
}
}
这对我来说似乎很有意义,至少在一段时间内是这样。但现在,我不太确定。如果我有一个想要锁门的 Person 对象,他会调用 aDoor.Lock()。但在现实生活中,我们不会通过告诉门自己锁上来锁门。
似乎更准确的情况模型是能够直接修改 aDoor 状态的人,前提是他有足够的权力锁门。例如,aCat 不应设置 aDoor.IsLocked = true。如果属性支持参数,我可以看到如何使用属性执行此操作:
class Person
{
public void LockDoor(Door door)
{
door.IsLocked(this) = true;
}
}
class Door
{
bool isLocked;
public bool IsLocked(Person person)
{
set
{
if(person != null) // ensure there is a real person trying to lock the door
{
this.isLocked = value;
}
}
}
}
static void Main()
{
Person personFromThinAir = new Person();
Door doorFromThinAir = new Door();
personFromThinAir.LockDoor(doorFromThinAir);
}
相反,我们可以做的是:
class Person
{
public void LockDoor(Door door)
{
door.SetLocked(this, true);
}
}
class Door
{
bool isLocked;
public void SetLocked(Person person, bool locked)
{
if(person != null)
{
this.isLocked = locked;
}
}
}
显然,这两个类是强耦合的,并且都可能在实际代码中提取接口(interface),但这不是我要表达的意思。我的问题是,这是对两个对象之间的关系进行建模的更好方法吗?还有比这更好的方法吗?我想得越多,我对 aDoor.Lock() 的理解就越少;这似乎违反了面向对象的设计。
最佳答案
尽管此人“锁上”了门,但实际上此人是在拨动(或摇晃)门的某个元素(锁 Handlebars ),并且该操作导致锁将门锁上。你可以这样想,虽然是人在移动门栓,但锁门的是门栓——而不是人。所以更好的表示可能是门有锁,这个人调用 lock.lock(),然后将锁设置为关闭(锁定)。
这里的基本前提是,虽然人在操纵锁,但那是外部的(函数调用)。锁的内部变化(函数内的代码)实际上是导致门锁上的原因。这个人每次都不会取下 Handlebars 并操纵内部来锁门 - 他们只是在外部切换一种状态并期望内部机器来处理它。
关于c# - OOD 和主客体混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1189140/
我是一名优秀的程序员,十分优秀!