依赖或关联设计

时间:2011-09-10 21:00:17

标签: dependencies associations

我对如何在依赖或关联方面处理设计的问题感到头疼。 问题出在这里:我需要随时生成一些数据。只有通过掌握一些其他数据的知识才能生成数据。所以,如果我有一个类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类处于“关联”关系。

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

那么,这个设计问题的正确方法是什么?你会怎么做?为什么? 请注意,y数据和z数据实例(由XDataGenerator使用)可能会受到整体设计中其他实体的更改。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果YDataZData个实例被多个XDataGenerator方法使用,则将它们定义为实例字段。

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

如果您只需要方法YData中的ZDatagenerate,并且不希望以后从外部进行修改以影响您的XDataGenerator实例,那么请执行此操作不使用实例字段,只使用generate内的参数。

现在对依赖关系进行一般性评论:为了避免依赖于实现,我宁愿对接口进行编程,即使用接口或抽象类来构造构造函数/ setter的参数以及实例字段定义。然后在运行时,您可以在该接口的不同实现之间进行交换。或者使用相同的实现,并进行一些通过界面无法看到的修改。


更新

您的标题有点令人困惑,因为关联意味着依赖关系。要阅读有关术语的更多信息,请参阅相应的blog post by Uncle Bob