我得到了面向对象编程中封装的一般概念,以及它如何促进以后的代码修改。然而,我经常感到困惑的是,物体的隔离应该走多远,特别是在相关物体的构造方面。
我的问题是,一个包的两个类应该知道自己多少,包括包可见性,以一个类返回另一个类的方式相关。例如,考虑A类和B类,其中B是A的有限视图,但不一定在内部包含相同类型的Collection。
考虑一个实际的例子,实现象棋或棋子的棋盘游戏。
让董事会成为一大堆路径,即从一个董事会边缘到另一个董事会边缘可以成为合法流动主体的字段参考集合。
让Vector成为对该路径具有部分访问权限的对象,但仅限于两个Field索引定义的范围。考虑subList方法类比。
这样的Vector被赋予了图形对象(例如Pawn),它可以进行移动并使用该结构获取可移动信息,并通过实现图替换和图捕获的方法执行移动。
要获取Vector,执行Board方法以获取适当的Path,然后轮流返回Vector。这是获取Vector对象的唯一方法。
这里的问题是如何构建Vector并在何处构建?这里有几个场景:
Path可以将fields
字段的整个引用传递给Vector构造函数,还是会破坏封装?
getVector
方法应该首先构建正确的container
,然后应该将其传递给一些简单的Vector
构造函数吗?
或者我应该将字段放到某个与两个类的实现中没有任何关系的中间集合中?
以下是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 */
}
根据实施情况, fileds
和container
可能会有很大差异。例如,fields
可以保存与给定Board路径关联的所有字段,但container
可以保留仅占用的字段。重点是设计对象之间的关系,以便很少依赖内部。