java - 数据隐藏的原因?

标签 java c++ oop

<分区>

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

最佳答案

这是关于复杂性的。以您的汽车引擎为例。这是一个非常复杂的对象。你可以,如果你知道足够的进入那里并摆弄东西并操作汽车。然而,这将是非常危险的。您也许可以做引擎设计者未打算做的事情。

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

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

每个人都很安全。

总结一下:

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

关于java - 数据隐藏的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18922457/

相关文章:

java - 为什么我的 LinkedList 不包含 addLast() 方法?

c++ - MSBuild 在构建时将 nuget 包应用于项目

java - 不使用 getter 和 setter 时的文档

java - 可以在 Java 中的枚举上使用 == 吗?

java - 在 Java 中使用枚举来表示 ResourceBundle 中的键

c++ - python 挑战,但对于 C++

c++ - 在类内部分配函数指针

oop - 事件溯源中的值对象

javascript - 如何在 Javascript 中制作自定义对象?

java - 如何检查我是否在 hibernate 中使用 c3p0?