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