加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何重构此代码层次结构(与Demeter法则相关)

发布时间:2020-12-16 09:23:34 所属栏目:百科 来源:网络整理
导读:我有一个游戏引擎,我将物理模拟与游戏对象功能分开.所以我有一个纯粹的虚拟课程 class Body 我将从中推导出物理模拟的各种实现.我的游戏对象类看起来像 class GameObject {public: // ...private: Body *m_pBody;}; 我可以插入我特定游戏所需的任何实现.但是
我有一个游戏引擎,我将物理模拟与游戏对象功能分开.所以我有一个纯粹的虚拟课程

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()这样的函数.相反,它应该具有MoveForward(int)或TurnLeft()函数,这些函数可以在内部调用GetPosition()(以及其他函数).基本上他们将一个界面翻译成另一个界面

如果你的逻辑需要一个GetPosition()函数,那么将它变成一个接口就是Ates Goral.否则,你需要重新思考为什么你如此深入地抓住一个对象来调用它的子对象上的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读