我正在重构我的一个项目 - 购物车。我的代码紧密耦合的一个区域是“Viewer”类 - 为了生成供用户查看的信息,它通常需要两个或多个以下对象的组合:
由于种种原因,我无法真正分解显示方法。
Martin Fowler的Refactoring将此视为“长参数列表”的气味。这里的相关重构是“引入参数对象”。但是,我对此犹豫不决,因为这样做会将松散相关的数据耦合在一起。它也会让我锁定这三个对象之间非常狭窄的一对一关系 - 虽然这对我的应用程序来说就像现在一样,但它没有现实意义。 (由于只有一个商店目录,因此可能有许多“客户邮件信息”对象,并且每个对象都可能与许多“客户订单”对象相关。)
有没有人对此有任何优雅的解决方案?
答案 0 :(得分:7)
三个参数的参数列表不需要重构。当你达到8或10个参数时开始担心。
答案 1 :(得分:2)
尝试命名绑定目录,订单和地址的东西。开始,可能是CatalogOrderAddressTuple
。丑,不是吗?好吧,也许作为Viewer
的实用工具类,它应该只是一个内部类,只需Tuple
- 或Data
即可。还是很难看。
听起来它们不属于Viewer
的实际字段 - 但是要探索一下,如果每个Viewer
只是用数据构建,那么代码会如何变化它运作。
作为ammoQ& Ryan Prior说过,这并不是什么味道,但我认为在完全放弃之前,值得玩一些替代品。
答案 2 :(得分:1)
答案 3 :(得分:1)
在我看来,引入参数对象会产生相反的效果,即锁定这三个对象之间的一对一关系。
如果传递单个客户地址,并且将来有人决定将帐单地址和送货地址分开,那么将新地址添加到参数对象可能更简单,而不是添加新参数并调用堆栈。
(当然,这只是一个例子。理想情况下,地址信息将单独存在于订单和客户对象中,因为发布订单上的所有信息都应该是不可变的,即使客户的地址发生变化。但这不是你在问什么!)