2010-10-08 86 views
1

我有下面的构造我的课依赖注入OR配置对象?

public MyClass(File f1, File f2, File f3, Class1 c1, Class2 c2, Class3 c3) 
{ 
.......... 
} 

可以看出,它有6个参数。在看到这段代码时,我的一位老年人说,我不应该传递6个参数,而应该传递一个配置对象。

我以这种方式编写代码,因为最近我已阅读“依赖注入”,其中说“类必须要求他们想要的东西”。所以我认为传递一个配置对象将违背原则。

我对“依赖注入”的解释是否正确?或者我应该接受我的资深建议?

+0

他如何建议实例化“配置”对象?总的来说,我认为你的方法很好。但我有点担心你将太多的事情传递给它。 – 2010-10-08 05:54:12

+0

配置对象使用java Properties类。它需要一个.properties文件。 – athena 2010-10-08 06:34:23

回答

10

“配置对象”是一个钝的术语,适用于这种情况;它以纯机械的意义来构建你的努力。目标是将你的意图传达给班级的消费者;让我们重构一下。

具有众多参数的方法或构造函数表明它们之间的松散关系。消费者通常必须做出更多推理才能理解API。 这3个档案连同这三个档次?这是没有传达的信息。

这是一个通过从隐式概念中提取显式概念来创建更有意义且意图揭示的接口的机会。例如,如果3个文件因为用户而相关,则UserFileSet参数将清楚地表示该文件。也许f1c1,f2c2f3c3有关。将这些关联声明为独立类将会减少参数数量并增加可从API派生的信息量。

最终,重构将高度依赖于您的问题域。不要以为你应该创建一个对象来完成一个参数列表;尝试沿着参数之间关系的轮廓进行重构。这总是会产生能够反映解决问题的代码,而不是用来解决问题的语言。

+1

我第二个这个单词:) – vulkanino 2010-10-08 16:50:25

2

我不认为使用配置对象与使用依赖注入模式相矛盾。它更多的是关于注入依赖关系的形式,以及关于是否最好有一个需要20个参数或将这些参数组合到一个类中以使它们被捆绑在一起的函数(在本例中为构造函数)的一般问题。

您仍然可以自由使用依赖注入,即通过某个工厂或容器构建配置对象,并在创建类的实例时将其注入构造函数。是否这是一个好主意还取决于具体情况,没有银子弹;)

+0

在我们的项目中,只有一个配置对象,其中包含所有属性。我对使用它的担心是,我将不得不在我的构造函数中创建Class1,Class2和Class3的对象。这似乎违背了“依赖注入”原则。 – athena 2010-10-08 06:31:23

+0

当然这是另一个问题如何Class1的对象等获得创建,但是从类MyClass的角度来看,它们被注入了依赖关系,无论它们是单独传递还是一起传递到对象中。在哪个构造函数中实例化Class1等 - 在配置对象的构造函数中? – 2010-10-08 07:23:23

+0

是的。所有需要的对象都在配置对象的构造函数中实例化。我很困惑,因为我不明白如何使用配置对象与使用工厂不同。 – athena 2010-10-08 10:15:07