我的Class
有以下构造函数 public MyClass(File f1, File f2, File f3, Class1 c1, Class2 c2, Class3 c3)
{
..........
}
可以看出,它有6个参数。看到这段代码后,我的一位老人说我不应该传递6个参数,而应该传递一个配置对象。
我用这种方式编写代码是因为最近我读过“依赖注入”,它说“类必须要求他们想要的东西”。所以我认为传递配置对象将违背原则。
我对“依赖注射”的解释是否正确?或者我应该听取老师的建议吗?
答案 0 :(得分:9)
“配置对象”是在这种情况下适用的钝化术语;它以纯粹的机械意义构建您的努力。目标是将您的意图传达给班级的消费者;让我们重构一下。
具有多个参数的方法或构造函数表明它们之间的松散关系。消费者通常必须做出更多推论才能理解API。 这3个文件与这3个类一起有什么特别之处?这是没有传达的信息。
这是一个通过从隐式概念中提取显式概念来创建更有意义且有意图的界面的机会。例如,如果3个文件因用户而相关,则UserFileSet
参数会清楚地表达该文件。可能f1
与c1
,f2
到c2
以及f3
到c3
有关。将这些关联声明为独立类会使参数计数减半并增加可从API派生的信息量。
最终,重构将高度依赖于您的问题域。不要假设您应该创建单个对象来完成参数列表;尝试沿着参数之间关系的轮廓重构。这将总是产生代码,它反映的问题比解决它的语言更能解决问题。
答案 1 :(得分:2)
我不认为使用配置对象与使用依赖注入模式相矛盾。它更多地是关于注入依赖关系的形式以及一个一般性问题:是否最好有一个函数(在这种情况下是构造函数),它接受20个参数或将这些参数组合成一个类,以便它们捆绑在一起。 / p>
您仍然可以自由地使用依赖注入,即由某个工厂或容器构造配置对象,并在创建类的实例时将其注入构造函数。这个好主意是否也取决于具体情况,没有银子弹;)