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

标签 c++ oop refactoring law-of-demeter

我有一个游戏引擎,我将物理模拟从游戏对象功能中分离出来。所以我有一个物理 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/

相关文章:

c++ - 编译器优化如何影响代码逻辑?

c++ - QuickSort 程序不工作

java - 有没有办法在 gradle 中进行源到源的 java 重构?

android - 有没有办法重构这个 RxJava 代码?

c++ - 将 Qt GUI 添加到动态库

c++ - 如何使用汇编程序(x64 OS)获取进程环境 block (PEB)地址?

c++ - 继承和 memcpy - 它是如何协同工作的?

matlab - 从 MATLAB 中的密封类继承

java - 类实例化实例,静态是类特定的,那么为什么实例不共享静态属性?

java - 如何将大型 Java 项目分成较小的组件