数据隐藏的原因?

我是编程新手。 谁能解释为什么数据隐藏是用任何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 

每个人都很安全。

总结一下:

  • 使您的对象安全 – 客户端无法执行您不想要的操作
  • 使您的对象更易于使用 – 客户端不需要知道类的所有内部工作以使用它
  • 有助于代码的可重用性 – 如果您决定更改类的实现,只要您不更改接口,那么客户端不会受到影响。

这似乎是一个非常广泛的问题,涉及广泛的考虑,但我会尝试解决几个项目:

当然,您的客户可能无法查看或更改您的代码(如果您提供完整的编译应用程序),但和任何其他维护人员都可以。 数据隐藏的目的是最小化数据与接口的每个级别之间的交互点。 这有助于您编写和维护正确的代码。

出于同样的原因,全局变量可能极难以正确的方式使用和维护,您对本地化数据的使用越多,就越容易理解代码并对正确性充满信心。

当您为类提供抽象接口时,您允许类对其内部数据/状态进行操作,而外界无需了解所使用的基础数据结构,类型或算法。 这样可以使您的代码更加简单,以便客户有效使用。