我在理解纯 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 的状态时,你如何处理这种情况。