c++ - 允许从类外部直接访问类成员变量是好的做法吗?
问题描述
给定以下课程:
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);
在执行期间,我想根据类成员变量 count 的值做一些事情。例如
if (outPut_1.count >= SOMEVALUE)
do_some_stuff();
我被告知这是不可接受的。为了遵循“OOP 的原则”,应该实现类方法以与类外部的类变量进行交互,例如,上面的代码需要变成
if (outPut1.getCount() >= SOMEVALUE)
并且类变量计数需要设为私有。
这是真的?或者如果需要允许直接访问类变量是否可以接受
解决方案
或者如果需要允许直接访问类变量是否可以接受
对良好软件工程和程序员生产力的大量研究表明,隐藏某些实现方式的细节通常是件好事。如果 A 人写了一个类,那么他/她对类应该如何工作有一定的假设。如果 B 想要使用这个类,那么他/她通常对这个类应该如何工作有不同的假设(特别是如果 A 没有很好地记录代码,甚至根本没有记录代码,这种情况经常发生)。那么 B 很可能会误用类中的数据,这会破坏类方法的工作方式,并导致难以调试的错误,至少对于 B 来说是这样。
此外,通过隐藏类实现的细节,A 人可以自由地完成对实现的返工,也许可以删除变量count
并用其他东西替换它。这可能是因为 A 想出了一个更好的实现方法count
,或者因为count
那里只是作为调试工具而不是实际工作所必需的ToggleOutput
,等等。
程序员不会只为自己编写代码。一般来说,他们为其他人编写代码,这些代码将为其他人维护。“其他人”包括五年后的你,当你审视自己是如何实施某事并问自己,我到底在想什么?通过隐藏实现的细节(包括数据),您可以自由地更改它,只要接口保持不变,客户端类/软件就不需要担心它。
推荐阅读
- c# - 无法获取 json 对象数据
- java - Java - 在 Try/Catch 期间弹出随机“null”
- angularjs - AngularJS - 使用 ng-include 将相同的范围绑定到表单的多个副本
- java - 用 Java 中的属性文件中的值替换 HashMap 键
- java - 以编程方式从 Android 设备执行文件
- sql - 分层查询 - 限制每个级别的元素数量
- c# - C# - 将日期转换为 unix 时间戳
- python - 如何在 Python 的 range() 函数中更改每个输入的请求
- r - 使用 h2o 集群进行神经网络模型
- python - Python Pandas:索引重叠?怎么修