数据隐藏的原因
Reason for data hiding?
我对编程很陌生。谁能解释为什么数据隐藏是用任何 oop 语言完成的?如果客户端无法查看/更改我的代码,为什么我需要隐藏数据。我永远不会显示或使用这些数据。什么保证隐藏?
这是关于复杂性的。以汽车的发动机为例。这是一个非常复杂的对象。如果你知道的足够多,你可以进去,摆弄东西并操作汽车。但是,这将是非常危险的。你也许可以做引擎设计师不打算做的事情。
在这个疯狂的场景中,你会得到一个界面。这是驾驶员与方向盘、齿轮、踏板等的位置。在那个位置,你可以做的事情是有限的,安全的,开车很容易。例如,如果不先踩下制动踏板,您就无法将档位换出驻车。如果我绕过界面直接进入引擎,即使它会导致引擎损坏,我也可能做任何事情。
要将其应用于软件,请考虑您是否有一个由 2 个整数值组成的 Fraction 类:一个分子和一个分母。有一个类不变量(规则)说:分母不能为0。如果分母恰好是 0,那么 Fraction 对象将毫无意义,并且将毫无用处。在下面的代码中,我没有隐藏变量:
public class Fraction{
int numerator;
int denominator;
public Fraction add(Fraction f){
//add this Fraction to f
}
....
}
在这种情况下,客户端代码可以执行此操作:
Fraction f1 = new Fraction();
f1.numerator = 2;
f1.denominator = 0;
Fraction f2 = new Fraction();
f2.numerator = 3;
f2.denominator = 4;
Fraction f3 = f1.add(f2);
您的添加方法在这里有什么作用?此代码的作用是将确保避免此类问题的责任交给客户端。通过适当的封装,确保所有对象都以完整性构造的责任属于类本身。
public class Fraction{
private int numerator;
private int denominator;
public void setDenominator(int d) throws IllegalArgumentException{
if(d == 0){
throw new IllegalArgumentExcepton("Denominator cannot be 0");
}
this.denominator = d;
}
...
}
如果客户端尝试执行此操作:
Fraction f1 = new Fraction();
f1.setDenominator(0); ///exception
每个人都是安全的。
所以总结一下:
- 使您的对象安全 - 客户端不能做您不希望做的事情
- 使您的对象更易于使用 - 客户端不需要知道类的所有内部工作原理即可使用它
- 有助于代码的可重用性 - 如果您决定更改类的实现,只要您不更改接口,客户端就不会受到影响。
这似乎是一个非常广泛的问题,涵盖了广泛的考虑范围,但我会尝试解决几个项目:
当然,你的客户端可能无法看到或更改你的代码(如果你提供了一个完整的编译应用程序),但你和任何其他维护者可以。数据隐藏的目的是最小化数据与接口的每个级别之间的交互点。这有助于您编写和维护正确的代码。
出于同样的原因,全局变量可能很难以正确的方式使用和维护,您越本地化数据的使用,就越容易摸索代码并确信正确性。
当您为类提供抽象接口时,您允许该类对其内部数据/状态进行操作,而无需外部世界了解有关所使用的底层数据结构、类型或算法的任何信息。这样,客户端就可以更轻松地使用代码。
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 只知道运行时的数据类型.如何将数据详细信息隐藏到使用它们的其他类
- pImpl、范围和隐藏数据成员
- 是否应隐藏所有数据成员
- 封装与数据隐藏
- 如何将隐藏的数据发送到 Pyqt 中的 QComboBOX
- 数据隐藏的原因
- 隐藏复合数据类型的某些字段,使其不被写入(或从hdf5文件中读取)
- 多态性和数据隐藏:基类是覆盖还是忽略派生类的访问限制?
- 在DDD中隐藏静态数据成员,或者只显示某些成员
- 如何使用英特尔预取pragma时,数据隐藏在一个对象
- 数据实际上是如何隐藏在类中的
- 在c++中隐藏数据