Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Oop 设计模式:将x添加到y,该方法应该放在哪里?_Oop_Design Patterns - Fatal编程技术网

Oop 设计模式:将x添加到y,该方法应该放在哪里?

Oop 设计模式:将x添加到y,该方法应该放在哪里?,oop,design-patterns,Oop,Design Patterns,我有一个X类和Y类,它们基本上是X的集合。我想写一个方法,将一个X添加到一个特定的集合Y中。这个方法会改变X上的一些状态,当然也会改变Y上的一些状态。我的问题是,在X类中使用这个方法的最佳位置是(所以这个方法将是X.addToY(Y)),还是应该在Y类中使用(Y.addX(X))?我应该考虑什么呢?考虑一下,如果你把方法放在X中,当Y包含X的集合时,它自己添加到Y中,那么X必须知道Y,Y必须知道X;如果你把方法放在Y中,那么Y需要知道X,但是X不需要知道Y。你可以避免循环依赖。除了这种方法与Y类

我有一个X类和Y类,它们基本上是X的集合。我想写一个方法,将一个X添加到一个特定的集合Y中。这个方法会改变X上的一些状态,当然也会改变Y上的一些状态。我的问题是,在X类中使用这个方法的最佳位置是(所以这个方法将是X.addToY(Y)),还是应该在Y类中使用(Y.addX(X))?我应该考虑什么呢?

考虑一下,如果你把方法放在X中,当Y包含X的集合时,它自己添加到Y中,那么X必须知道Y,Y必须知道X;如果你把方法放在Y中,那么Y需要知道X,但是X不需要知道Y。你可以避免循环依赖。

除了这种方法与Y类的常识关联之外,另一个需要考虑的问题是并发性:虽然这最初可能是一个单线程应用,但你(或其他人)将来可能会扩展类Y以启用同步多线程集合访问,在这种情况下,在Y中使用
addX
肯定会更方便,这样多线程子类就可以用其并发支持重写该方法。

在您的情况下,它非常简单,但是想象一下,
Y
可以容纳不同于
X
的其他元素,比如
A
B
C
类型的元素。这些类型是否应该知道如何添加到集合
Y
?答案是否定的,但是如果是这样的话,您必须为每种类型实现一个
AddToY
方法,这一点都不好。集合
Y
知道如何向自身添加项目,而不管这些项目是什么类型的。这被称为,它主要说明每种类型或实体都应该具有其关注的功能。在这种情况下,您可以看到集合应该能够将项目添加到自身,但特定类型的
X
可能与集合无关,因此,它不应该具有将自身添加到特定集合的功能。希望这有助于您理解。

如果
y
x
的集合,那么您可以将
x
添加到
y
中,这样添加方法将进入
y