重构:Extract Method

1、创造一个新函数,根据这个函数的意图对它命名,以做什么来命名,而不是以怎样做命名

2、将提炼出的代码从源函数复制到新建的目标函数中

3、仔细检查提炼出的代码,看看其中是否引用例如“作用于限于源函数”的变量,包括局部变量和源函数参数

4、检查是否有仅用于被提炼代码段的临时变量,如果有,在目标函数中将它们声明为临时变量

5、检查被提炼的代码段,看看是否有任何局部变量的值被它改变,如果一个临时变量的值被修改了,看看是否可以将被提炼的代码段处理为一个查询,并将结果赋值给相关变量,如果很难这样做,或如果被修改的变量不止一个,就不能仅仅将这段代码原封不动地提取出来,可能需要先使用Split Temporary Variable,然后再尝试提炼,也可以使用Replace Temp wih Query将临时变量消灭掉

6、将被提炼代码段中需要读取的局部变量,当作参数传给目标函数

7、处理完所有局部变量之后,进行编译

8、在源函数中,将被提炼的代码替换为对目标函数的调用

9、如果将任何临时变量移到目标函数中,请检查它们原本的声明式是否在被提炼代码段的外围,如果是,现在可以删除这些声明式了

10、编译、测试

 

关于局部变量的处理

1、如果被提炼代码段只是读取这些变量的值,并不修改它们,这样情况下可以简单地将它们作为从参数传递给目标函数

2、如果局部变量是个对象,而被提炼的代码调用了会对该对象造成修改的函数,也可以将这个对象作为参数传递给目标函数即可

3、如果被提炼的代码段对局部变量赋值,但是这个变量只在被提炼代码段中使用,可以将这个临时变量的生命移到被提炼代码段中,然后一起提炼出去。

4、如果被提炼的代码段之外的代码也使用了这个变量,就需要让目标函数返回该变量改变之后的值

5、如需要被返回的变量不止一个,最好的选择是挑选另外一块代码来提炼,最好让每个函数只返回一个值,所以安排多个函数,返回多个值。

 

一个例子

void print() {
		Enumeration e = _orders.elemtents();
		double outstanding = 0.0;
		
		// print baner
		System.out.println("***********************************");
		System.out.println("********** Customer Oews **********");
		System.out.println("***********************************");
		
		// calculate outstanding
		while (e.hasMoreElements()) {
			Order each = (Order) e.nextElement();
			outstanding += e.getAmount();
		}
		
		// print details
		System.out.println("name: " + _name);
		System.out.println("amount: " + outstanding);
	}


首先提炼出 print baner部分代码

void print() {
		Enumeration e = _orders.elemtents();
		double outstanding = 0.0;
		
		// print baner
		printBaner();
		
		// calculate outstanding
		while (e.hasMoreElements()) {
			Order each = (Order) e.nextElement();
			outstanding += e.getAmount();
		}
		
		// print details
		System.out.println("name: " + _name);
		System.out.println("amount: " + outstanding);
	}

	private void printBaner() {
		System.out.println("***********************************");
		System.out.println("********** Customer Oews **********");
		System.out.println("***********************************");
	}


然后提炼出 print detail这部分代码

void print() {
		Enumeration e = _orders.elemtents();
		double outstanding = 0.0;
		
		// print baner
		printBaner();
		
		// calculate outstanding
		while (e.hasMoreElements()) {
			Order each = (Order) e.nextElement();
			outstanding += e.getAmount();
		}
		
		// print details
		printDetail(outstanding);
	}

	private void printDetail(double outstanding) {
		System.out.println("name: " + _name);
		System.out.println("amount: " + outstanding);
	}

	private void printBaner() {
		System.out.println("***********************************");
		System.out.println("********** Customer Oews **********");
		System.out.println("***********************************");
	}

 

最后提炼出  calculate outstanding这部分代码

void printOwing() {
		// print baner
		printBaner();
		// calculate outstanding
		double outstanding = getOutstanding(e, outstanding);
		// print details
		printDetail(outstanding);
	}

	private double getOutstanding() {
		Enumeration e = _orders.elemtents();
		double result = 0.0;
		while (e.hasMoreElements()) {
			Order each = (Order) e.nextElement();
			result += e.getAmount();
		}
		return result;
	}

	private void printDetail(double outstanding) {
		System.out.println("name: " + _name);
		System.out.println("amount: " + outstanding);
	}

	private void printBaner() {
		System.out.println("***********************************");
		System.out.println("********** Customer Oews **********");
		System.out.println("***********************************");
	}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值