我在大学这个学期学习高级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;}
};
当程序不需要用户输入时,为什么有一个预定义的变量是不好的做法?我的意思是,如果用户需要为项目添加一个数字,我可以理解这样做,然后我会做到这一点,但如果它不要求用户输入,我就不会有用户输入。
答案 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()
就会有一些有用的东西,顾名思义。