数据隐藏的原因?

时间:2013-09-20 17:22:56

标签: java c++ oop

我是编程新手。谁能解释为什么数据隐藏是用任何oop语言完成的?如果客户端无法查看/更改我的代码,为什么我需要隐藏数据。我永远不会显示或使用该数据。什么值得躲藏?

2 个答案:

答案 0 :(得分:9)

这与复杂性有关。以你的汽车发动机为例。这是一个非常复杂的对象。你可以,如果你知道足够的东西进入那里并且操作汽车并且操作汽车。但是,这将是非常危险的。你也许可以做引擎设计师不想要的事情。

在这个疯狂的场景中,你会得到一个界面。这就是驾驶员在方向盘,齿轮,踏板等方面的位置。在那个位置,你可以做的事情是有限的,安全的,驾驶汽车很容易。例如,如果没有先踩刹车踏板,就无法将档位改变。如果我绕过接口并直接进入发动机,我可能会做任何事情,即使它会导致发动机的损坏。

要将此应用于软件,请考虑您是否具有由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

每个人都很安全。

总结一下:

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

答案 1 :(得分:0)

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

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

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

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