【问题标题】:Classes Using their Own Getters/Setters使用自己的 Getter/Setter 的类
【发布时间】:2011-01-14 13:48:17
【问题描述】:

假设我有以下课程:

class MyClass
{
    private:

    int Data;

    public:

    MyClass(int Init)
    {
        Data = Init;
    }

    int GetData() const
    {
        return Data;
    }
};

现在,假设我想添加一个方法来检查Data 是否等于零。有两种方法可以做到这一点:

bool DataIsZero() const
{
    return Data == 0;
}

或者:

bool DataIsZero() const
{
    return GetData() == 0;
}

哪种做法被认为是更好的做法?我可以看到仅使用变量本身可能会提高可读性,但使用 getter 可能会使代码更易于维护。

【问题讨论】:

  • 一个风格注意是你的成员函数应该是小写的。大写通常保留给静态成员。

标签: c++ class getter


【解决方案1】:

我不太喜欢 getter/setter 的原因,我不会在这里讨论。他们在其他问题中有所涉及。但是,由于您已经询问过它们,我的回答将假设我使用 getter/setter;它不会访问所有可能的替代方案。

出于您提到的维护原因,我会使用吸气剂。实际上,抽象是首先使用 getter 的一半目的(以及稍微更严格的访问控制)。

如果使用变量比使用 getter 更易读,那么您的 getter 函数名称很差,应该重新考虑。

顺便说一句,最好初始化成员,而不是事后在构造函数主体中分配它们。事实上,您必须使用常量来做到这一点,所以您不妨从现在开始并保持一致:

class MyClass
{
private:
    int Data;

public:

    MyClass(int Init) : Data(Init) {}

    int GetData() const {
        return Data;
    }
};

查看构造函数的变化。

【讨论】:

  • 应该使用getter,因为当获取值的代码改变时,所有直接访问成员的方法也必须改变。维护噩梦。此外,许多编译器将内联简单的 getter 和 setter,因此工作由打字员(程序员)完成。
  • @ThomasMatthews:或者,换句话说,“我会使用吸气剂,因为你提到的维护原因”。 :)
【解决方案2】:

您应该使用 getter,因为如果您的类在 getter 中移动到更复杂的逻辑,那么您将与更改隔离。但是,如果您的类提供公共 getter,我会质疑创建此方法的逻辑。

【讨论】:

  • 关于您的第二句话,虽然我不一定不同意您的观点,但可能值得注意两点:(a) OP 的示例 可能 是一个简化的、做作的代码示例;实际用例可能不那么做作; (b) std::string::empty() 相当不错,尽管很容易将 std::string::length()0 进行比较。所以有时有一个理由让成员函数看起来有点毫无意义。
【解决方案3】:

这取决于。

对于简单的类来说,前者就足够了。

如果方法是虚拟的,后者隐藏了实现并且可以支持多态性。

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2017-11-22
    • 2011-06-13
    • 2012-03-12
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多