我对抓纯OOD的概念还是有点问题。如何理解纯OOD的概念?
假设我们有一个班级人类,我们生活在一个有时人类走路(大脑指挥腿部)的地方,有时树木会消失(人类注意到),有时人类会随机碰撞彼此。
前两种情况是真的没有脑子:
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);
};
现在,我已经有了一个非常糟糕的问题命中方法。当然,这是很好,你可以说
anna.hit(bob);
直到这里,我认为这是很好(请抱怨,如果有什么地方不好),并喜欢读散文(其良好的面向对象的代码应该)。但是,你如何将打到OOP?如果安娜击中鲍勃而鲍勃倒下,那么坠落既不是由安娜也不是由鲍勃直接造成的。这是由命中,失衡和物理造成的。
我知道只有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(); }
}
在这种情况下,Bob的身体“通知”指出,命中造成他摔倒在地,他会再“动自己”在地。我认为这比第一种方案更好,但这仍然不太合适。
所以,请聪明的OOP乡亲,向我解释,你是怎么处理的情况下,当在现实世界中A修改B的状态,但在OOP世界上只有乙方应修改B.
的状态
如果树木消失,周围没有人类,他们发出声音吗? – 2011-04-23 14:35:37
@Emile:真正的问题是:树木如何消失? – darioo 2011-04-23 14:44:23
@darioo:如果不是人类,他们是如何出现在第一位的? – Potatoswatter 2011-04-23 19:58:58