gpt4 book ai didi

c# - OOD 和主客体混淆

转载 作者:行者123 更新时间:2023-11-30 13:18:25 25 4
gpt4 key购买 nike

假设我有一个门的定义:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com