【问题标题】:Should you use accessors on complex data types?您应该对复杂数据类型使用访问器吗?
【发布时间】:2014-02-16 20:27:33
【问题描述】:

您应该对复杂数据类型使用访问器吗?这是一个例子:

假设我有一个 Player 类,里面有一个 Sprite 对象。假设Sprite 对象有一个setPosition() 访问器方法。现在假设我想通过播放器调用该方法,所以我在Player 中创建Sprite 对象的访问器。

class Player
{
public:
    const Sprite& getSprite() const;

private:
    Sprite sprite;
}

现在假设我创建了一个“玩家”对象,我如何在sprite 上调用setPosition?我不能只说playerObject.getSprite().setPosition();,因为Sprite 引用getSprite() 方法返回的是const。

考虑到sprite 对象对它的所有成员都有保护,我是否应该在这种情况下将sprite 对象公开?或者这是一种不好的做法,我确实需要使用访问器?

【问题讨论】:

  • 您应该考虑SOLID 原则。从代码的模块化和可维护性的角度来看,您的问题的答案可能不是您明确要求的。首先,您可能希望将游戏逻辑与表示(精灵等)分开

标签: c++ accessor data-protection


【解决方案1】:

没有好的答案:

有一个二维点:

class Point {
    public:
    // Skipping constructors here.
    int x() const { return m_x; }
    int x&() { return m_x; }
    int y() const { return m_y; }
    int y&() { return m_y; }

    private:
    int m_x;
    int m_y;
};

相比看起来有点矫枉过正
struct Point {
    int x;
    int y;
};

第一个允许您将内部数据(比如说)更改为 std::vector,第二个数据结构不允许更改。即使是第一个也很麻烦,我更喜欢那个(但这是一个品味问题)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    相关资源
    最近更新 更多