Dependencies 依赖或关联设计

Dependencies 依赖或关联设计,dependencies,associations,Dependencies,Associations,我对如何从依赖性或关联性的角度来处理设计的问题感到头疼。 问题是:我需要随时生成一些数据。只有了解手头的其他数据,才能生成数据。因此,如果我有一个类XDataGenerator;似乎是这样的: class XDataGenerator { void generate ( YData* y_in, ZData* z_in, XData* x_out); } ,其中YData和ZData与XDataGenerator类处于“依赖”关系 但是,使用“关联”是另一种选择,如下所示: clas

我对如何从依赖性或关联性的角度来处理设计的问题感到头疼。 问题是:我需要随时生成一些数据。只有了解手头的其他数据,才能生成数据。因此,如果我有一个类XDataGenerator;似乎是这样的:

class XDataGenerator 
{
    void generate ( YData* y_in, ZData* z_in, XData* x_out);
}
,其中YData和ZData与XDataGenerator类处于“依赖”关系

但是,使用“关联”是另一种选择,如下所示:

class XDataGenerator
{
     YData* mY;
     ZData* mZ;
     void generate( XData* x_out);
}
,其中YData和ZData与XDataGenerator类处于“关联”关系

在“dependency”版本中,x_In和y_In参数被传递给函数“generate”, 在“关联”版本中,通过成员属性(指向对象的指针)访问这些参数

那么,解决这个设计问题的正确方法是什么呢?你将如何接近,为什么? 请注意,y数据和z数据实例(由XDataGenerator使用)可能会在总体设计中被其他实体更改


提前感谢。

如果多个
XDataGenerator
方法使用了
YData
ZData
实例,则将它们定义为实例字段

如果它们可能会被其他实体更改,并且您希望这些更改在
XDataGenerator
实例中可见,那么就可以了。如果您不想在
XDataGenerator
实例中看到这些副作用,请在构造函数/设置器中进行防御性复制

如果在方法
generate
中只需要
YData
ZData
,并且不希望以后从外部进行修改以影响
XDataGenerator
实例,则不要使用实例字段,而只使用
generate
中的参数

现在来谈谈依赖关系:为了避免对实现的依赖,我宁愿针对接口编程,即使用接口或抽象类作为构造函数/设置器的参数以及实例字段定义。然后在运行时,您可以在该接口的不同实现之间进行交换。或者使用相同的实现,并进行一些在接口中看不到的修改


更新:


您的标题有点混乱,因为关联意味着依赖关系。要了解更多有关术语的信息,请参阅相应的。

谢谢您的回复。是的,我希望这些更改通过generate方法可见。实际上,YData和ZData是不断更新的,ZData应该相应地更新,以便与这些更改同步。有一个XDataGenerator实例希望查看这些YData和ZData实例的最新状态。所以,使用它们中的任何一个(依赖或关联)似乎都是同样正确的,对吗?我不明白如何应用你关于使用接口的建议,是的,实例字段和参数都可以。我会将XDataGenerator中的YData和ZData对象保存为实例字段,而不进行防御性复制,并使用getter(例如名为generate)获取相应的当前扩展数据(坐标y,坐标z)(在Java表示法中,但同样适用于C++)。