【发布时间】:2011-08-11 12:11:44
【问题描述】:
我对纯 OOD 概念的理解还是有点问题。
假设我们有一个 Human 类,我们生活在一个世界中,有时人类会走路(大脑控制腿),有时树木会消失(人类会注意到这一点),有时人类会随机撞到对方。
前两种情况真的很简单:
class Tree {
private:
void disappear()
{
// call onTreeDisappeared() for all human observers
}
};
class Human {
public:
// The human notices that a tree disappeared
void onTreeDisappeared();
private:
int x, y, z;
// Human wants to walk forward
void moveForward();
// Hit another human, possibly causing him to fall down
void hit(Human &target);
};
现在我的 hit 方法遇到了一个非常糟糕的问题。当然,你可以说很好
anna.hit(bob);
到目前为止,我认为它很好(如果有问题请抱怨)并且读起来像散文(好的 OOP 代码应该如此)。但是如何将命中转移到 OOP 中呢?如果 Anna 撞到 Bob 并且 Bob 摔倒了,那么摔倒既不是 Anna 也不是 Bob 直接造成的。它是由撞击、失去平衡和物理造成的。
对于这种情况,我只知道 2 个选项,但不知何故,我认为两者都很糟糕:
public: void fallDown()
{ z = 0; }
public: void hit(Human &target)
{
bool targetFallsDown = true; // could be random or any algorithm you like
if(targetFallsDown)
{ target.fallDown(); }
}
在这种情况下,安娜“摔倒”鲍勃。但这完全没有任何意义。这不像安娜抓住鲍勃的身体并将其移向地面。但还有另一种选择:
private: void fallDown()
{ z = 0; }
public: void onHitCausesMeToFallDown()
{ fallDown(); }
public: void hit(Human &target)
{
bool targetFallsDown = true; // could be random or any algorithm you like
if(targetFallsDown)
{ target.onHitCausesMeToFallDown(); }
}
在这种情况下,鲍勃的身体“注意到”击中导致他倒在地上,然后他会“移动”到地上。我认为这比第一个选项要好,但这仍然感觉不对。
所以请聪明的 OOP 人向我解释一下,当现实世界中 A 修改 B 的状态但在 OOP 世界中只有 B 应该修改 B 的状态时,你如何处理情况。
【问题讨论】:
-
如果树木消失了,周围没有人,它们会发出声音吗?
-
@Emile:真正的问题是:树木是如何消失的?
-
@darioo:如果不是人类,它们最初是如何出现的?