Как мне понять концепцию чистого ООД?

У меня все еще есть небольшая проблема с пониманием концепции чистого 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);
};

Теперь у меня действительно серьезная проблема с методом попадания. Конечно, приятно, что вы можете сказать

anna.hit(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(); }
}

В этом случае тело Боба «замечает», что удар заставляет его упасть на землю, затем он «переместится» на землю. Я думаю, что это лучше, чем первый вариант, но это все равно почему-то кажется неправильным.

Итак, пожалуйста, умные ребята из ООП, объясните мне, как поступать со случаями, когда в реальном мире A изменяет состояние B, но в мире ООП только B должен изменять состояние B.

5
задан meagar 8 December 2011 в 16:46
поделиться