我有一个游戏引擎,我将物理模拟从游戏对象功能中分离出来。所以我有一个物理 body 的纯虚拟类
class Body
我将从中导出物理模拟的各种实现。我的游戏对象类看起来像
class GameObject {
public:
// ...
private:
Body *m_pBody;
};
而且我可以为该特定游戏插入我需要的任何实现。但是当我只有一个 GameObject
时,我可能需要访问所有 Body
函数。所以我发现自己写了很多东西,比如
Vector GameObject::GetPosition() const { return m_pBody->GetPosition(); }
我很想把它们都刮掉,然后做类似的事情
pObject->GetBody()->GetPosition();
但这似乎是错误的(即违反得墨忒耳法则)。另外,它只是将冗长的实现从实现推向了使用。所以我正在寻找一种不同的方式来做到这一点。
最佳答案
Demeter 法则的思想是您的 GameObject
不应该具有 GetPosition()
之类的函数。相反,它应该具有可以在内部调用 GetPosition()
(以及其他函数)的 MoveForward(int)
或 TurnLeft()
函数。本质上,它们将一种界面转换为另一种界面。
如果您的逻辑需要 GetPosition()
函数,那么将其转换为 Ates Goral 的接口(interface)是有意义的。否则,您将需要重新考虑为什么要如此深入地了解一个对象以调用其子对象的方法。
关于c++ - 如何重构此代码层次结构(与 Demeter 法则相关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/468090/