c++ - 我如何掌握纯 OOD 的概念?

标签 c++ oop ooad

我在理解纯 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);
};

现在我在 hit 方法上遇到了一个非常严重的问题。你能说当然很好

anna.hit(bob);

直到这里,我认为它还不错(如果有问题请提示)并且读起来像散文(好的 OOP 代码应该如此)。但是如何将击球转移到 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(); }
}

在这种情况下,安娜“摔倒”了鲍勃。但这完全没有任何意义。这不像是 Anna 捕获 Bob 的 body 并将其移向地面。但还有另一种选择:

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 的 body “注意到”撞击导致他倒地,然后他会“移动自己”到地面。我认为这比第一个选项要好,但感觉还是不对。

所以请聪明的 OOP 人向我解释一下,当现实世界中 A 修改 B 的状态但在 OOP 世界中只有 B 应该修改 B 的状态时,您如何处理这种情况。

最佳答案

我认为您陷入了试图在类中模拟“真实”世界而没有设计目的的陷阱。

您的程序 应该做什么?一旦你解决了这个问题,你就可以开始设计你想要建模的现实世界的哪些方面,以及现实世界的哪些部分无关紧要,不需要建模。仅仅因为易于可视化就将类映射到具体的现实世界对象类型通常是错误的。您只需为对您的程序重要的概念建模。

OOD 是关于使用抽象和多态性等技术允许对象相互交互而无需了解彼此的实现。

在您的实现中,您需要决定要建模的行为以及每个对象需要的知识。例如,您可能希望一个人根据他受到的打击力度来判断他是否想摔倒。

void Human::receiveHit(Hit hit)
{
    if (hit.IsBigForThisWeight(this->weight))
        this->fallDown();
}

请注意,击中我的东西不需要知道或关心它会对我产生什么影响。这是我对打击的 react 。我还模拟了一个“命中”对象,因为它对我的程序有意义。通过创建一个 Hit 对象并让我接收它,任何东西都可以击中我。将来我可能会被公共(public)汽车或火车撞到,而我的类(class)没有任何变化。

关于c++ - 我如何掌握纯 OOD 的概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5764764/

相关文章:

c++ - 来自同一个 enable_shared_from_this 实例的两个 shared_ptr

c++ - 继承的 Sprite 不可绘制

c++ - 通过字符数组搜索

Python对象初始化,__init__方法

vb.net - 覆盖 System.Diagnostics.Trace.WriteLine 以记录到文件

c++ - C++ 中主要问题和设计问题之前的类

c++ - 将 0.999 显示为 0.99

php - 如何更改查询的数组方案结果?

java - 使用嵌套对象处理父类和子类的继承

c++ - 在 C++ 中什么时候应该使用类还是结构?