首页 > 解决方案 > 允许从类外部直接访问类成员变量是好的做法吗?

问题描述

给定以下课程:

class ToggleOutput {

  public:
    uint32_t count;
    ToggleOutput(PARAMETERS) //I've just removed stuff to reduce the code
    {
      // The code when setting things up
    }

    void Update()  // public method to toggle a state
    {
        // this method will check if a time period has elapsed
        // if the time period has elapsed, toggle an output
        // Each time the output is toggled on then count gets incremented

        count += 1;
     }
};

稍后在代码中,创建了几个 ToggleOutput 实例

ToggleOutput outPut_1(PARAMETERS); // Again, PARAMETERS are just the stuff 
ToggleOutput outPut_2(PARAMETERS); // I've cut out for brevity.
ToggleOutput outPut_3(PARAMETERS);
ToggleOutput outPut_4(PARAMETERS); 

在执行期间,我想根据类成员变量 count 的值做一些事情。例如

if (outPut_1.count >= SOMEVALUE)
  do_some_stuff();

我被告知这是不可接受的。为了遵循“OOP 的原则”,应该实现类方法以与类外部的类变量进行交互,例如,上面的代码需要变成

if (outPut1.getCount() >= SOMEVALUE)

并且类变量计数需要设为私有。

这是真的?或者如果需要允许直接访问类变量是否可以接受

标签: c++oop

解决方案


或者如果需要允许直接访问类变量是否可以接受

对良好软件工程和程序员生产力的大量研究表明,隐藏某些实现方式的细节通常是件好事。如果 A 人写了一个类,那么他/她对类应该如何工作有一定的假设。如果 B 想要使用这个类,那么他/她通常对这个类应该如何工作有不同的假设(特别是如果 A 没有很好地记录代码,甚至根本没有记录代码,这种情况经常发生)。那么 B 很可能会误用类中的数据,这会破坏类方法的工作方式,并导致难以调试的错误,至少对于 B 来说是这样。

此外,通过隐藏类实现的细节,A 人可以自由地完成对实现的返工,也许可以删除变量count并用其他东西替换它。这可能是因为 A 想出了一个更好的实现方法count,或者因为count那里只是作为调试工具而不是实际工作所必需的ToggleOutput,等等。

程序员不会只为自己编写代码。一般来说,他们为其他人编写代码,这些代码将为其他人维护。“其他人”包括五年后的你,当你审视自己是如何实施某事并问自己,我到底在想什么?通过隐藏实现的细节(包括数据),您可以自由地更改它,只要接口保持不变,客户端类/软件就不需要担心它。


推荐阅读