缩短“长”参数列表

时间:2010-02-15 07:22:40

标签: refactoring

我正在重构我的一个项目 - 购物车。我的代码紧密耦合的一个区域是“Viewer”类 - 为了生成供用户查看的信息,它通常需要两个或多个以下对象的组合:

  • 商店目录。
  • 客户的订单。
  • 客户的邮寄信息。

由于种种原因,我无法真正分解显示方法。

Martin Fowler的Refactoring将此视为“长参数列表”的气味。这里的相关重构是“引入参数对象”。但是,我对此犹豫不决,因为这样做会将松散相关的数据耦合在一起。它也会让我锁定这三个对象之间非常狭窄的一对一关系 - 虽然这对我的应用程序来说就像现在一样,但它没有现实意义。 (由于只有一个商店目录,因此可能有许多“客户邮件信息”对象,并且每个对象都可能与许多“客户订单”对象相关。)

有没有人对此有任何优雅的解决方案?

4 个答案:

答案 0 :(得分:7)

三个参数的参数列表不需要重构。当你达到8或10个参数时开始担心。

答案 1 :(得分:2)

尝试命名绑定目录,订单和地址的东西。开始,可能是CatalogOrderAddressTuple。丑,不是吗?好吧,也许作为Viewer的实用工具类,它应该只是一个内部类,只需Tuple - 或Data即可。还是很难看。

听起来它们不属于Viewer的实际字段 - 但是要探索一下,如果每个Viewer只是用数据构建,那么代码会如何变化它运作。

作为ammoQ& Ryan Prior说过,这并不是什么味道,但我认为在完全放弃之前,值得玩一些替代品。

答案 2 :(得分:1)

正如ammoQ所述,寻找具有如此少参数的重构机会正在拉伸。 另请参阅:KISSYAGNI

答案 3 :(得分:1)

在我看来,引入参数对象会产生相反的效果,即锁定这三个对象之间的一对一关系。

如果传递单个客户地址,并且将来有人决定将帐单地址和送货地址分开,那么将新地址添加到参数对象可能更简单,而不是添加新参数并调用堆栈。

(当然,这只是一个例子。理想情况下,地址信息将单独存在于订单和客户对象中,因为发布订单上的所有信息都应该是不可变的,即使客户的地址发生变化。但这不是你在问什么!)