为什么在类的私有部分声明变量被认为是不好的做法? C ++

时间:2016-03-18 06:44:07

标签: c++ class

我在大学这个学期学习高级C ++,并且我一直在努力重新提交我的工作,因为我在使用声明变量的不良做法而不使用mutator方法来设置它们。

我被告知使用这样的代码是不好的做法。

class test{
private:
   int number = 5;
   int number2 = 10;
public:
   int addNums(){
       number3 = number+number2;
       return number3;}
};

我的导师建议我应该使用这样的声明。

class test{
private:
   int number, number2;
public:
   void setNums(userInput, userInput2){//Where user input is gained from a seperate function setting as 5, 10.
       number = userInput;
       number2 = userInput2;}
   int addNums(){
       number3 = number+number2;
       return number3;}
};

当程序不需要用户输入时,为什么有一个预定义的变量是不好的做法?我的意思是,如果用户需要为项目添加一个数字,我可以理解这样做,然后我会做到这一点,但如果它不要求用户输入,我就不会有用户输入。

4 个答案:

答案 0 :(得分:2)

你的导师告诉你只需要那么少的投资就可以让你的课程更有用。

  

我的意思是,如果用户需要为这些项目添加一个数字,我就能理解这一点,然后我会做到这一点,但如果它没有要求用户输入,我就会这样做不会有用户输入。

在此,您承认它会产生预期的效果。

在设计时要问自己的问题是"我的用户期望什么?"该类的合理用户是否期望无法传递数字?我认为你的导师对此的回答是" no"。我也是这样倾斜的。

请注意,程序中的硬编码输入可以使用相同的逻辑。您的计划的合理用户是否期望无法传递数字?是的,这正是用户要求的。

答案 1 :(得分:1)

我认为setter通常是糟糕设计的标志,因为它们可以决定在课堂外制作对象状态。在你的(太)简单示例中,我将初始化构造函数中的变量:

class test{
private:
   int number;
   int number2;
public:
   test(int x, int y):
      number(x), number2(y) {}

   test(): test(5, 10) {}

   int addNums(){
       return number+number2;
   }
};

但是,没有人知道测试类应该做什么或者它有什么责任。最好更改addNums以获取两个参数,并完全删除成员。

答案 2 :(得分:0)

如果没有提供用户输入,该课程是否有意义?

如果是,预定义值也可能有意义。尽管如此,他们只是选择的魔术数字,因为

如果没有,那么类对象根本不应该是可创建的。确保构建的唯一方法是通过ctor,需要值。

如果您愿意,您也可以向ctor添加默认值,虽然这是混合两种方法,实际上类似于声明中提供的默认值。

答案 3 :(得分:0)

你必须问自己的基本设计问题是“这门课的目的是什么”?

如上所述,它有一个名为addNums()的成员函数,总是返回值15(假设number3已在某处声明。如果这是它的目的,那就远了机制太多;成员函数应该只返回15,如果就是这样,那么它的名字应该改变,因为它不会添加任何数字。

另一方面,如果类的目的是保存两个值并返回它们的总和,则必须通过构造函数或某种成员函数来设置值。一旦有了设置值的方法,addNums()就会有一些有用的东西,顾名思义。