是否允许从班级外部直接访问班级成员变量?

时间:2018-11-11 04:21:40

标签: c++ oop

提供以下课程:

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); 

在执行过程中,我想根据类成员变量的值进行计数。例如

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

有人告诉我这是不可接受的。要遵循“ OOP的宗旨”,应该使用类方法来与类外部的类变量进行交互,例如,上面的代码需要成为

if (outPut1.getCount() >= SOMEVALUE)

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

这是真的吗?还是可以根据需要允许直接访问类变量

2 个答案:

答案 0 :(得分:3)

  

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

对优秀软件工程和程序员生产力的大量研究表明,隐藏某些实现方式的细节通常很好。如果A人写了一堂课,那么他/他就该课应该如何工作有某些假设。如果人B要使用该类,则他/他通常对类应如何工作有不同的假设(特别是如果人A没有很好地编写代码,或者甚至根本不编写代码,情况就经常如此)。这样,人B可能会滥用类中的数据,这可能会破坏类方法的工作方式,并导致至少对于人B而言难以调试的错误。

此外,通过隐藏类实现的详细信息,人员A可以自由地完成对实现的重新设计,也许可以删除变量count并将其替换为其他变量。发生这种情况的原因是,人A想出了一种更好的实现count的方式,或者因为count只是作为调试工具而已,对于ToggleOutput的实际工作不是必需的,等等。

程序员不仅为自己编写代码。通常,他们为他人编写代码,这些代码将由他人维护。从现在开始的五年后,“其他人”包括您,当您查看如何实施某项并问自己时,我到底在想什么?通过隐藏实施的详细信息(包括数据),您可以可以自由更改,只要接口保持不变,客户端类/软件就不必担心。

答案 1 :(得分:0)

基本上,成员访问是您对开发人员施加的规则。

这是您要采取的措施,以防止您自己或使用类的其他开发人员修改应该仅由类本身而不由其他人管理的属性。

它与安全性无关(嗯,无论如何不一定),更多的是语义问题。如果不应该在外部进行修改,则应为private

那你为什么要关心呢?好吧,它可以帮助您保持代码的一致性和组织性,这在与开发团队或打算分发的代码一起工作时尤其重要。

如果您必须记录您的课程,则只需要对public的内容进行记录,就班级用户而言,没有其他问题。