Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于一个工厂来说,构造函数中的参数太多是一种代码味道吗?_Java_Design Patterns - Fatal编程技术网

Java 对于一个工厂来说,构造函数中的参数太多是一种代码味道吗?

Java 对于一个工厂来说,构造函数中的参数太多是一种代码味道吗?,java,design-patterns,Java,Design Patterns,我有一个工厂类,目前它的构造函数中有6个参数,我只是需要添加另一个 通常,这会对我尖叫“嘿,你的类有太多的依赖项,因此,它做的太多了!” 然而,考虑到这个类严格来说是一个工厂,真的是这样吗?我是否应该关注日益增多的依赖关系?如果是这样的话,我应该考虑什么样的策略来重构?p> 更新: 我曾考虑过建设者模式,但对于一个工厂来说,这不是过分了吗 (即,WidgetFactoryBuilder,它构建了一个构建小部件的工厂。) 此外,我不明白构建器是如何真正减轻我的依赖性的——它只是将它们从构造函数移到

我有一个工厂类,目前它的构造函数中有6个参数,我只是需要添加另一个

通常,这会对我尖叫“嘿,你的类有太多的依赖项,因此,它做的太多了!”

然而,考虑到这个类严格来说是一个工厂,真的是这样吗?我是否应该关注日益增多的依赖关系?如果是这样的话,我应该考虑什么样的策略来重构?p> 更新:
我曾考虑过建设者模式,但对于一个工厂来说,这不是过分了吗

(即,
WidgetFactoryBuilder
,它构建了一个构建小部件的工厂。)

此外,我不明白构建器是如何真正减轻我的依赖性的——它只是将它们从构造函数移到方法中——这似乎使事情变得更加混乱——然而,这可能是因为对如何在这种情况下应用构建器模式的理解不足。

  • 考虑将参数(任何有意义的)分组到某种FactoryConfigurationObject中
  • 如果失败,请考虑使用Builder模式< /LI>
  • 但通常是的,以上三个参数开始闻起来

当许多参数是可选的时,这尤其是一个问题。在这种情况下

也要考虑构造函数是否真的需要每个特定的类。例如,如果它需要一个

URL
,则向其传递一个
URL
,而不是碰巧具有
URL
属性的
WebPage
对象。这不会减少参数的数量,但会限制外部依赖的表面积

关于您的更新:Mine和@iluxa的回复主要关注具有多个参数的方法的另一个缺点,即它们很难读取和维护。此上下文中的生成器是工厂的替代品。看


依赖性问题只能用另一个问题来回答:您的工厂是否真正依赖于每个参数?试着想一想可能没有的方法。

首先,我应该提到,我不一定认为六个参数太多。但是如果你坚持

我认为问题根本不在于构造函数的参数数量

其他人推荐的生成器模式对于包含大量状态的类很有用。对于工厂来说,这种情况很少发生。相反,我将假设您所讨论的参数是对其他类的依赖。真正的问题是工厂有太多的依赖项,而不是它的构造函数接受太多的参数


相反,你需要看看设计。为什么工厂有这么多的依赖关系?有没有可能以某种方式减少这个数字?也许工厂创建的对象本身太复杂了?

代码气味到底意味着什么?我第一次听说it@Chuck代码气味表明您的代码有问题。我不确定它是否是鲍勃·马丁创造的,但我第一次读到它是在他的书中@Chuck Birkin,代码气味基本上是指一段代码没有明确包含bug,但可以被视为应用程序设计/拼凑不当,因此可能包含bug的指示器。皮特,@Tim Bender感谢guysKent Beck创造了“代码气味”这个词。他在克莱斯勒公司时创建了极限编程。我不确定构建器模式是否适合,因为我的类是一个工厂。也许这是我的理解力差--您介意在这里扩展一下如何使用生成器吗?Factory f=new Factory.builder().withParam1().withParam2().withParam3().create()+1 Grea关于上下文对象的回复!