我对如何在依赖或关联方面处理设计的问题感到头疼。 问题出在这里:我需要随时生成一些数据。只有通过掌握一些其他数据的知识才能生成数据。所以,如果我有一个类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使用)可能会受到整体设计中其他实体的更改。
提前致谢。
答案 0 :(得分:0)
如果YData
和ZData
个实例被多个XDataGenerator
方法使用,则将它们定义为实例字段。
如果他们可能会被其他实体更改,并且您希望在XDataGenerator
实例中看到这些更改,那就没问题了。如果您不希望在XDataGenerator
实例中看到这些副作用,请在构造函数/设置器中进行防御性复制。
如果您只需要方法YData
中的ZData
和generate
,并且不希望以后从外部进行修改以影响您的XDataGenerator
实例,那么请执行此操作不使用实例字段,只使用generate
内的参数。
现在对依赖关系进行一般性评论:为了避免依赖于实现,我宁愿对接口进行编程,即使用接口或抽象类来构造构造函数/ setter的参数以及实例字段定义。然后在运行时,您可以在该接口的不同实现之间进行交换。或者使用相同的实现,并进行一些通过界面无法看到的修改。
更新
您的标题有点令人困惑,因为关联意味着依赖关系。要阅读有关术语的更多信息,请参阅相应的blog post by Uncle Bob。