【问题标题】:Shortening a "Long" parameter list缩短“长”参数列表
【发布时间】:2010-02-16 01:56:17
【问题描述】:

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

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

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

Martin Fowler 的重构将此识别为“长参数列表”气味。这里的相关重构是“引入参数对象”。但是,我对此犹豫不决,因为这样做会耦合松散相关的数据。它还将我锁定在这三个对象之间非常狭窄的一对一关系中——虽然这对我现在的应用程序有效,但它在现实世界中没有任何意义。 (因为店铺目录只有一个,所以可以有很多“客户邮寄信息”对象,每一个都可能关联多个“客户订单”对象)。

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

【问题讨论】:

    标签: refactoring


    【解决方案1】:

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

    【讨论】:

    • 澄清一下——我有很多方法使用这三个对象的集合或子集——而且应用程序很简单,感觉应该有一个更优雅的解决方案。该应用程序绝不是难以维护,我正在执行此重构,以学习。
    • 在手头没有实际问题的情况下,不要试图让某些东西“更优雅”,因为最有可能的结果是过度设计。
    【解决方案2】:

    尝试命名绑定目录、订单和地址的事物。开始,也许是CatalogOrderAddressTuple。丑陋,不是吗?好吧,也许作为Viewer 的实用程序类,它应该只是一个内部类,您可以只使用Tuple - 或Data。还是很丑。

    听起来这些字段并不属于 Viewer 的实际字段 - 但请探索如果每个 Viewer 仅使用其操作的数据构造,您的代码将如何变化。

    正如 ammoQ 和 Ryan Prior 所说,这没什么大不了的,但我认为在完全放弃之前尝试一些替代品是值得的。

    【讨论】:

    • 在考虑了这个问题之后,似乎根本原因是我未能忠实地实现 MVC - 我应该在我的问题中指定这一点。使用定义明确的模型类,我可以让查看器通过模型访问 Catalog/Order/MailingInfo,而不是让我的控制器继续将这些数据作为参数传递给它。
    • 这听起来对我来说是一个很好的答案。正确的 MVC 摇滚。我很高兴你坚持了下来。
    【解决方案3】:

    正如 ammoQ 所说,寻找具有如此少参数的重构机会是一件很困难的事情。 另请参阅:KISSYAGNI

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 这是真的 - 我按照这种推理方式犯了一个相当大的错误。
      猜你喜欢
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多