【问题标题】:Using a get function vs making a member variable public [closed]使用get函数与公开成员变量[关闭]
【发布时间】:2014-07-22 14:38:41
【问题描述】:

首选的 C++ 风格是什么,使用 get 和 set 函数来获取和设置成员变量的值,或者只是将成员变量公开?

class MyClass
{
public:    
    std::string getValue();
    std::string setValue();
private:    
    std::string value; 
};

对

class MyClass
{
public:
    std::string value;
};

第二个看起来更干净,我真的看不出比第一个有什么好处,除了如果你通过代码行获得报酬可以让你多一点钱。

【问题讨论】:

  • 第一个不允许修改。
  • 第一种方法的优点是它不会暴露对象的(可变)实现和私有状态。
  • 如果我想进行更改,我还可以包含一个std::string setValue(); 函数。我应该澄清一下。
  • 如果它提供了getter和setter,你必须问这个类在抽象什么。
  • 两者都不好。您应该考虑您的业务模型并相应地编写您的方法,而不是制作 getter 和 setter。使用get() 和set(),你最终会在你的代码库中散布很多像setA(getA()+1) 这样的代码。

标签: c++ coding-style


【解决方案1】:

我真的不认为第一个有任何好处,除了如果你通过代码行获得报酬,你可以得到更多的钱。

根据这个推理,考虑到维护成本,第二种方法可能会给您更多的钱。

想象一下,有一天您会将value 更改为从其他成员计算而来。拥有一个 getter 可以很容易地添加此行为而不会影响代码库。

每个实例中存储了一个string 值这一事实应该是一个实现细节,而不是公开可见的 API 的一部分(至少在理论上如此:没有继承,成员存在的事实对任何人都是可见的用户)。不得不编写样板的 getter 和 setter 很烦人,但从长远来看,这是值得的。

但通常,具有太多 setter 和 getter 对的类还有其他设计缺陷,并且通常有太多可变状态。此外,在 C++ 中,如果具有数千个 getter/setter 对的类只保存状态并且根本不定义任何行为,则它应该是 struct。

【讨论】:

  • 但是更改实现以动态计算value 会使setter(它已经是接口的一部分)无用。
  • 确实如此 - 也许 setter 从未使用过,可以更安全地删除。虽然已编辑。
  • @Alex 不过要明确一点,当您说“具有太多 setter 和 getter 对的类还有其他设计缺陷”时,您并不是要暗示使用 getter 和 setter 是设计缺陷本身,对吗?
  • 没错。 - setters/getters 本身很好,但我发现拥有太多它们的类经常同时做太多事情。我个人喜欢在对象中捕获不可变状态的模式(即在对象构造时传递一些状态并在整个生命周期内保持不变)。在这种情况下,getter 比 setter 多得多。虽然是 YMMV。
【解决方案2】:

向世界“展示”对象的内脏是不好的做法。可能稍后您可能想要更改类实现,甚至使您的 值 不是 std::string。

随着项目的发展,很多事情都会发生变化,当然,您可以稍后添加getValue,但在这种情况下,您将弃用旧的“API”并创建新的,这可能会导致更新等问题.

此外,使 public 成员允许用户读取/修改此成员,而无需通知类本身。这会造成“糟糕的设计”问题。

【讨论】:

  • or even make your value not to be std::string - 在这种情况下使用访问功能有什么帮助?
  • @Gluttton 一个 getter 可以将类型从内部类型转换为任何其他类型。
【解决方案3】:

公共类成员反对封装,这是 OO 原则之一。

最常见的约定是不使用get和set这两个词,只使用变量名。我们只是让编译器根据参数的存在或不存在来决定是设置还是获取。

成员变量应以前缀“m_”开头。

其他选项是函数名以大写字母开头,变量以正则..开头。

ImageMagick 等许多开源库都使用此约定。

你的班级应该如下:

class MyClass
{
public:
    void value(const std::string& v){
       m_value=v;
     }
    const std::string& value()const {
        return m_value;
     }
private:
    std::string m_value;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多