Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 封装-对象的隔离程度应该有多深?_Java_Encapsulation - Fatal编程技术网

Java 封装-对象的隔离程度应该有多深?

Java 封装-对象的隔离程度应该有多深?,java,encapsulation,Java,Encapsulation,我了解了面向对象编程中封装的一般概念,以及它如何促进以后的代码修改。然而,我经常感到困惑,对象的隔离应该走多远,特别是在相关对象的构造方面 我的问题是,一个包的两个类应该了解多少,它们都具有包可见性,并且以一个类返回另一个类的方式相互关联。例如,考虑A类和B类,其中B是对A的一些有限视图,但是不一定在内部包含相同类型的集合。 考虑一个实际的例子,实现像国际象棋或跳棋这样的棋盘游戏 将电路板实现为大量路径,即,从一个电路板边缘到另一个电路板边缘的合法移动主体字段的引用集合 设Vector为对该路径

我了解了面向对象编程中封装的一般概念,以及它如何促进以后的代码修改。然而,我经常感到困惑,对象的隔离应该走多远,特别是在相关对象的构造方面

我的问题是,一个包的两个类应该了解多少,它们都具有包可见性,并且以一个类返回另一个类的方式相互关联。例如,考虑A类和B类,其中B是对A的一些有限视图,但是不一定在内部包含相同类型的集合。 考虑一个实际的例子,实现像国际象棋或跳棋这样的棋盘游戏

将电路板实现为大量路径,即,从一个电路板边缘到另一个电路板边缘的合法移动主体字段的引用集合

设Vector为对该路径具有部分访问权限的对象,但仅限于由两个字段索引定义的范围。考虑子式方法类比。

该向量被赋予图形对象,例如,执行运动的棋子,并使用该结构来获取信息(如果运动是可能的),并通过实现图形替换和图形捕获的方法来执行运动

为了得到向量,执行Board方法,获得适当的路径,然后依次返回向量。这是获得矢量对象的唯一方法

这里的问题是如何以及在哪里构造向量?这里有几个场景:

路径是否可以将对字段的整个引用传递给向量构造函数,或者这是否违反了封装

getVector方法是否应该先构造适当的容器,然后再将其传递给某个死气沉沉的简单向量构造函数

或者,我应该将字段放在与这两个类的任何实现都不相关的中间集合中吗

下面是一些Java代码以供说明:

class Path {
   private LinkedList<Field> fields;
   public Vector getVector(FieldIndex start, FieldIndex end) {
       /** ... */
   }
}

class Vector {
   /** some internal hidden representation */
   private SomeContainer<Field> container;
   /** some public methods for querying the fields contained */
}

根据实现的不同,文件和容器可能会有很大的不同。例如,字段可以保存与给定线路板路径关联的所有字段,但容器可以保存(例如)仅占用的字段。关键是要设计对象之间的关系,使其很少依赖于内部结构。

刚好能够完成任务。如果您担心封装的嵌套级别,那么您想得太多了FieldIndex到底是什么?某个int-holding对象对其自身强制执行边界?@CandiedOrange假设您可以通过FieldIndex以这种或其他方式推断列表的int。例如,在跳棋中,它可以是板矩阵坐标“x,y”,路径上的每个字段在“x”上各有一个不同。若路径保持第一个坐标,你们就有了你们所需要的一切。但是,还有很多其他的方法可以实现它。@pixelbits,我恐怕是的。我已经读了很多关于保持尽可能的弹性是多么重要的书,但我真的不知道理智到底在哪里结束。你的意思是getVector可能会返回一个秩、文件或板的对角线?所以两个FieldIndex实际上是两个坐标点,比如说A1到A8?