【问题标题】:Reason for data hiding? [closed]数据隐藏的原因? [关闭]
【发布时间】:2013-09-20 17:22:55
【问题描述】:

我对编程很陌生。谁能解释为什么用任何 oop 语言进行数据隐藏?如果客户无法查看/更改我的代码,为什么我需要隐藏数据。我永远不会显示或使用这些数据。什么保证隐藏?

【问题讨论】:

  • 你能举例说明你的意思吗?
  • 客户端如何在未隐藏的情况下无法查看/更改您的代码?
  • 你应该在programmers.stackexchange.com上问这个
  • 哦,当他们说 client 时,他们通常不是指键盘后面的用户,而是使用您的类的其他类。

标签: java c++ oop


【解决方案1】:

这是关于复杂性的。以您汽车的发动机为例。这是一个非常复杂的对象。如果你足够了解的话,你可以进去玩弄东西并操作汽车。然而,这将是非常危险的。您可能会做引擎设计师不打算做的事情。

在这个疯狂的场景中,您将获得一个界面。那是驾驶员的位置,方向盘,齿轮,踏板等。在那个位置,您可以做的事情受到限制,并且安全,并且驾驶汽车很容易。例如,如果不先踩下制动踏板,就无法将档位换出驻车档。如果我绕过接口直接进入引擎,我可能会做任何事情,即使它会导致引擎被破坏。

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

你的 add 方法在这里做什么?这段代码所做的是将确保避免此类问题的责任交给客户。通过适当的封装,确保所有对象都以完整性构造的责任属于类本身。

  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

每个人都很安全。

总结一下:

  • 使您的对象安全 - 客户不能做您不打算做的事情
  • 使您的对象更易于使用 - 客户无需了解类的所有内部工作原理即可使用它
  • 有助于代码的可重用性 - 如果您决定更改类的实现,只要不更改接口,客户端就不会受到影响。

【讨论】:

    【解决方案2】:

    这似乎是一个相当广泛的问题,涵盖了广泛的考虑范围,但我将尝试解决几个问题:

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

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

    当您为一个类提供一个抽象接口时,您允许该类对其内部数据/状态进行操作,而无需外部世界了解有关所使用的底层数据结构、类型或算法的任何信息。然后,这使您的代码更简单,客户可以有效地使用。

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 2021-06-22
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多