純粋な OOD の概念を理解するには、まだ少し問題があります。
クラス Human があり、人間が歩く (脳が足を制御する) ときもあれば、木が消え (人間がそれに気付く) ときもある 世界に住んでいるとしましょう。
最初の 2 つのケースは本当に簡単です。
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 コードはそうあるべきです)。しかし、どうやってヒットを 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(); }
}
この場合、ボブの体は、ヒットによって地面に倒れていることに「気づき」、地面に「移動」します。これは最初のオプションよりも優れていると思いますが、それでもどうもうまくいきません。
ですから、賢明な OOP 関係者の皆さん、私に説明してください。現実の世界では A が B の状態を変更するのに、OOP の世界では B だけが B の状態を変更する必要がある場合をどのように処理しますか?