在诸如游戏的角色类之类的类中声明公共变量会被视为糟糕的设计吗?
示例:
class Character{
public:
Character();
int health;
void attack(int);
private:
int attackPow;
};
void Character::attack(int hp){
hp -= attackPow;
}
Character hero;
Character bad;
hero.attack(bad.health);
因为健康变量是公共的,我可以通过在函数中调用它来直接修改它,或者甚至通过获取整个对象并将其属性修改为我的想法,当然,也返回整个对象。
但是,如果变量是私有的,我将不得不有一个单独的函数来更改私有变量,因此会使代码更加......混乱......或者还有另一种方法吗? (你不得不原谅我,我还不是一个专家,但是非常有趣的问题,但是)
这被认为是不好的做法吗?
答案 0 :(得分:2)
这是将health
属性设为私有并使用单独函数的优点。现在它可能看起来像这样:
int getHealth() { return health; }
但是,这只是游戏的开始状态。想象一下,你希望增加更多因素,比如盾牌,你希望在目前的健康状况之上计算。如果在您的代码中,您只使用了公共变量,那么您现在必须更改所有内容,即;
hero.attack(bad.health + bad.shield);
在改变一个功能方面,这是很多工作:
int getHealth() { return health + shield; }
答案 1 :(得分:0)
我想这是一种基于意见的观点,但我认为这是:
如果您确定您的类只是一组没有不变量且永远不会的值,那么您正在寻找一个struct
all < / em>数据成员是public
。这种情况很少发生,比如
struct point {double x,y,z;};
可能是一个例子。
否则,只使用class
private
成员 并保护这些不变量。
在您的情况下,您应该选择一个private
成员的班级。例如,您可能希望每次健康变得小于或等于零时都做某事。您只能为private
成员保证此类内容。
答案 2 :(得分:-1)
在中声明公共变量会被视为糟糕的设计吗? 诸如游戏的角色类之类?
是的,当然。
但这只是一个指南,你知道。在真实的代码中,在一个真实的项目中,与同事,老板,需求,客户,截止日期,具有数千个依赖关系的遗留代码库,公司政治和商业心理学,you may find yourself applying bad design because it's the right thing to do in the grand scheme of things。
但是,如果变量是私有的,我将不得不分开 函数来改变私有变量,因此会使代码更多 更多...凌乱
如果变量是私有的,
如果您不希望从外部修改变量,则甚至不需要setter方法。
您可以在不更改许多其他源代码文件的情况下更改其类型。
您可以更改其名称,而无需更改许多其他源代码文件或依赖于您环境的自动重构功能。
您可以通过在setter方法中添加错误检查来限制变量可能具有的值的范围。
通过在setter方法中写入日志输出,您可以更轻松地添加日志以查看变量的修改时间
您可以通过在setter方法中设置它来更轻松地设置调试的断点。
如果涉及多个线程,您可以更轻松地保证对变量的同步访问。
这就是我想到的第一个想法。列表可能会更长。
私有变量是用C ++(以及其他类似的编程语言)创建结构化,可维护代码的核心。