Preserve Whole Object(保持对象完整)

动机

有时候,你会将来自同一对象的若干项数据作为参数,传递给某个函数。这样做的问题在于:万一将来被调用函数需要新的数据项,你就必须查找并修改对此函数的所有调用。如果你把这些数据所属的整个对象传给函数,可以避免整个尴尬的处境,因为被调用函数可以向那个参数对象请求任何它想要的信息。

除了可以使参数列更稳固之外,Preserve Whole Object往往还能提高代码的可读性。过长的参数列很难使用,因为调用者和被调用者都必须记住这些参数的用途。此外,不使用完整对象也会造成重复代码,因为被调用调用函数无法利用完整对象中的函数来计算某些中间值。

不过事情总有两面。如果你传的是数值,被调用函数就只依赖于这些数值,而不依赖它们所属的对象。但如果你传递的是整个对象,被调用函数所在的对象就需要依赖参数对象。如果这会使你的依赖结构恶化,那么就不该使用Preserve Whole Object。

我还听过另一种不使用Preserve Whole Object的理由:如果被调用函数只需要参数对象的其中一项数值,那么只传递那个数值会更好。我并不认同这种观点,因为传递一项数值和传递一个对象,至少在代码清晰度上市等价的(当然对于按值传递的参数来说,性能上可能有所差异)。更重要的考量应该放在对象之间的依赖关系上。

还有一种常见情况:调用者将自己的若干数据作为参数,传递给被调用函数。这种情况下,如果该对象有合适的取值函数,你可以使用this取代这些参数值,并且无须操心对象依赖关系。

做法

  1. 对你的目标函数新添一个参数项,用以代表原数据所在的完整对象。
  2. 编译,测试。
  3. 判断哪些参数可被包含在新添的完整对象中。
  4. 选择上述参数之一,将被调用函数中原来引用该参数的地方,改为调用新添参数对象的相应取值函数。
  5. 删除该项参数。
  6. 编译,测试。
  7. 针对所有可从完整对象中获得的参数,重复上述过程。
  8. 删除调用段中那些带有被删除参数的代码。
  9. 编译,测试。

范例

在以下范例中,我以一个Room对象表示“房间“,它负责记录房间一天中的最高温度和最低温度。然后这个对象需要将实际的温度范围与预先规定的温度控制计划相比较,告诉客户当天温度是否符合计划要求:

class Room...
	boolean withinPlan(HeatingPlan plan) {
   
		int low = daysTempRange().getLow();
		int high = daysTempRange().getHigh();
		return plan.withinRange(low, high);
	}
class HeatingPlan...
	boolean withinRange(
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值