简单易懂读《重构》 - Incomplete Library Class (不完美的库类)

不完美的库类

  • 含义:
    封装好的类库中功能不能满足实际需求
  • 缺憾:
    库中没有某些需求能够使用的方法函数等,封装好的库不能更改
  • 目标:
    解决代码不能更改造成的不便
  • 实现方法:
    • 使用 Introduce Foreign Method(引入外加函数)
    • 或使用 Introduce Local Extension(引入本地扩展)

本文涉及的重构方法

Introduce Foreign Method(引入外加函数)
  • 作用:
    在一个无法修改的类中增加新的函数,剥离出来作为静态函数放在需要的类中使用
  • 步骤:
  • 把入参改为需要更改的整个值,然后建立一个私有静态方法,并把实现逻辑放在其中。
  • 如果只在本类中使用,可以使用本方法,否则,考虑使用Introduce Local Extension(引入本地扩展)
  • 代码实例
//如:获取会员生效时间
Prime prime = _prime; // 会员bean,内有年月日
Date effectTime = new Date(prime.getYear(),prime.getMonth(),prime.getDate() + 1);
//重构后,放入静态方法中可以公用
private static Date getEffectTime(prime) {
	return new Date(prime.getYear(),prime.getMonth(),prime.getDate() + 1);
}
  • 重构思路:
    如果以上的方法很多地方都需要用到,考虑使用Introduce Local Extension(引入本地扩展)
Introduce Local Extension(引入本地扩展)
  • 作用:
    需要在一个无法修改的类中增加新的功能
  • 步骤:
  • 建立一个继承的子类或者包装类
  • 在这个类中加入转型的构造参数
  • 加入需要的新特性方法
  • 根据需要将原对象的引用替换为这个新的对象
代码实例
//如:想包装Date类来实现更多特性
//继承方式
class MyDate extends Date {
	public MyDate nextDay()...
	public int dayOfYear()...
	//添加构造函数
	public MyDate(String dateString) {
		super(dateString);
	}
	//添加转型构造函数,
	public MyDate(Date arg) {
		super(arg.getTime());
	}
	//上文提到的方法,作为新特性加到这里
	Date getEffectTime(Prime prime) {
		return new Date(prime.getYear(),prime.getMonth(),prime.getDate() + 1);
	}	
}
//包装方式
class MyDate {
	private Date original;
	//添加构造函数
	public MyDate(String dateString) {
		original = new Date(dateString);
	}
	//添加转型构造函数,
	public MyDate(Date arg) {
		original = arg;
	}
	//上文提到的方法,作为新特性加到这里
	Date getEffectTime(Prime prime) {
		return new Date(prime.getYear(),prime.getMonth(),prime.getDate() + 1);
	}	
	//还需要搬移原来Date中需要用到的函数...
}
  • 重构思路:
    子类的好处是不需要重新写原函数中需要用到的方法,工作量较少,但是子类需要在创建对象的时候就开始使用。另外,在有其他对象引用过旧对象的时候,就会存有2份数据,如果旧对象的数据能被修改,就会造成2个对象数据不一致。这时候可以改为使用包装类,包装类可以保证每次修改使多个引用的实例都改变值,但是缺点是实现比较麻烦。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值