什么时候/为什么要在课堂上私有化?

Ram*_*lol 20 c++ oop class-design private-methods

什么时候我应该做一个功能private,为什么这是个好主意?

Jac*_*kin 25

private当你从类中调用它时,你应该在不需要其他对象或类来访问函数时创建一个函数.

坚持最小特权原则,只允许访问绝对必要的变量/函数.任何不符合这个标准的东西应该是private.

  • (因为您已经强调了在更广泛的OO领域中偏爱的“方法”术语,所以仅供参考)“功能”是C ++标准中使用的术语,在C ++上下文中非常正确。 (2认同)

Naw*_*waz 21

我通常会做助手功能private.但帮助者 似乎含糊不清.那么让我举个例子.假设你有以下课程Sample; 它暴露了很少的公共功能,其中一个就是说DoWork().该函数有一个参数.但它并不假设参数始终有效,因此它首先检查参数的有效性,该参数在函数开头有很多代码.像这样的东西:

class Sample
{
   public:
      void DoWork(SomeClass param)
      {
               /*
                *lots of code related to validation of param
                */  

                //actual code that operates on the param 
                //and other member data IF the param is valid
      }
};
Run Code Online (Sandbox Code Playgroud)

由于您编写了许多与验证param相关的代码,因此它使函数变得繁琐且难以阅读.因此,您决定将此验证代码移动到函数说,IsValidParam()然后DoWork()通过将参数传递param给它来调用此函数.像这样的东西:

class Sample
{
   public:
      void DoWork(SomeClass param)
      {       
            if ( IsValidParam(param))       
            {
                //actual code that operates on the param 
                //and other member data IF the param is valid
            }
      }
};
Run Code Online (Sandbox Code Playgroud)

看起来更干净吧?

好吧,你已经IsValidParam()在课堂上的某个地方写过了,但你现在面临的问题是,你能做到这个功能public吗?如果此功能由您的其他功能使用DoWork(),则IsValidParam() 公开没有意义.所以你决定做这个功能private.

class Sample
{
   public:
      void DoWork(SomeClass param)
      {       
            if ( IsValidParam(param))       
            {
                //actual code that operates on the param 
                //and other member data IF the param is valid
            }
      }
  private:
      bool IsValidParam(SomeClass param)
      {
          //check the validity of param.
          //return true if valid, else false.
      }
};
Run Code Online (Sandbox Code Playgroud)

这种功能(IsValidParam)应该是private.我将这些函数称为辅助函数.

希望这个解释能帮到你!


Jon*_*ood 5

OOP的创始原则之一是封装.这是对象如何工作的功能保持在该对象的内部.这个想法是,如果代码不需要知道它是如何工作的,那么它就更容易使用它.有点像买微波炉 - 你只需要知道如何使用它而不是如何使用它.

OOP应采用相同的方法.保留维护对象私有所需的一切.仅制作完全使用对象public所需的内容.