如何避免让我的GameManager类成为大多数东西的朋友

How to avoid having my GameManager class be friend with most stuff?

本文关键字:大多数 朋友 何避免 我的 GameManager      更新时间:2023-10-16

我正在为一门电子游戏课程编写一款游戏(不幸的是这门课程没有教授任何内容),我在设计游戏实体和实际运行游戏的类之间的交互时遇到了麻烦。

我的问题大致可以归结为:假设一个实体有一个位置,它不应该能够直接修改它(而是必须等待游戏管理器运行一个游戏步骤),但它应该能够访问它,运行AI检查等等。

我的解决方案是创建一个与GameManager为友的Position类,并创建一个像这样的实体类

class Entity {
    public:
        Position & getPosition() { return pos_; }
    private:
        Position pos_;
};

因此管理器可以修改实体的位置,但其他类只能观察。然而,这种推理将适用于许多其他属性,并且由于实体类实际上派生为一系列子类,这些子类具有越来越多的属性,因此我将不得不将friend属性几乎放在任何地方。

解决这个问题的更好方法是什么?

将某些类标识为好友而将其他类标识为非好友的想法不是一个好主意,原因有很多。这意味着,

这个类如何被使用也是这个类所关心的。

但这根本不是它所关心的。这个类,无论考虑的是什么类,都应该被设计成承担自己的责任。

现在,根据你的情况,首先你应该决定改变位置的动作/行为属于;它属于实体、实体管理器还是别的什么。例如,以下两种情况哪一种更有意义:

  1. 实体将位置从x1更改为x2。
  2. 实体管理器将实体位置从x1更改为x2。

假设你决定这个行为真的属于实体,而不是实体管理器(情况1)。在这种情况下,正如@bengoesboom在评论中指出的那样,它应该提供一个setter,类的用户可以使用它来改变它的位置。

现在,如果您认为这个类可能以不希望的方式使用,那么您应该在这个类中实施约束和业务规则。例如(只是一个简单的例子),如果您希望在操作中只允许特定范围的值。检查输入,如果不在范围内,则抛出异常。

一旦你妥善处理了规则和约束,那么你就不用关心谁将使用这个类了