读书笔记-重构 - Extract Method(提炼方法)

原创 2013年12月03日 23:53:15

目标:

把代码片段整理提炼出来赋予他一个合适的名字

ps:命名的原则是方法名能够表达方法是做什么的,而不是说方法是怎么做的。怎么做的是要放在方法体里面实现的。


简单示例:

修改前

void printOwing(double amount) {  

  printBanner(); 

  //print details 

  System.out.println ("name:" + _name);

  System.out.println ("amount" + amount);

}

修改后

void printOwing(double amount) {    

printBanner();    

printDetails(amount);

void printDetails (double amount) {    

System.out.println ("name:" + _name);    

System.out.println ("amount" + amount);

}

好处:方法的结构清晰,主方法中只需要看两个方法名就知道这个方法干了什么,怎么干的。

怎么提炼:

1.为你要提炼的代码段取一个合适的名字。如果不能做到这一点的话,说明你对这个代码段提炼考虑还不够成熟。就暂时不要动这段代码。

2.把要提炼的代码段拷贝出来放到新的方法中。

3.查看变量。如果是源方法里面的变量,就考虑把他当做参数传给新的方法中。如果只有这个新方法中能够用到的话,就直接放在子方法中作为临时局部变量使用。

4.需要再仔细学习*ing

5.把结构体的变量传入字方法中,保存修改

6.检查子方法中的局部变量是否还在父方法中声明,如果有的话,就需要给删掉。

7.重构结束。测试。


具体应用场景:

修改前

void printOwing() {
Enumeration e = _orders.elements();
double outstanding = 0.0;

// print banner
System.out.println ("**************************");
System.out.println ("***** Customer Owes ******");
System.out.println ("**************************");

// calculate outstanding
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += each.getAmount();
}

//print details
System.out.println ("name:" + _name);
System.out.println ("amount" + outstanding);
}

修改后

1.no Local variables

void printOwing() {
Enumeration e = _orders.elements();
double outstanding = 0.0;

printBanner();

// calculate outstanding
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += each.getAmount();
}

//print details
System.out.println ("name:" + _name);
System.out.println ("amount" + outstanding);
}

void printBanner() {
// print banner
System.out.println ("**************************");
System.out.println ("***** Customer Owes ******");
System.out.println ("**************************");
}

2.use local variables

void printOwing() {

Enumeration e = _orders.elements();
double outstanding = 0.0;

printBanner();

// calculate outstanding
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += each.getAmount();
}

printDetails(outstanding);
}

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

3.reassigging a local variables

void printOwing() {
printBanner();
double outstanding = getOutstanding();
printDetails(outstanding);
}

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

4.最理想的修改案,之前的代码碎片都不用管了

void printOwing(double previousAmount) {
printBanner();
double outstanding = getOutstanding(previousAmount * 1.2);
printDetails(outstanding);
}































重构 改善既有的代码设计 读书笔记4 composing method

ExtractMethod: 将一段代码抽出来,放到一个方法里面,并用这段代码的功能来对方法进行命名。 当一段代码需要注释来说明它的作用的时候,可以考虑使用Extract Method。 有3种情...

java 重构学习2:提炼函数(Extract method)

本系列来自《java 重构改善既有代码的设计》一书 1、Extract Method:提炼方法 将有些代码单独提取出来放入到一个独立的函数中,并让函数名称来解释该函数的用途。...

《腾讯方法》读书笔记

  • 2017年05月18日 17:09
  • 692KB
  • 下载

《Spring In Action》 读书笔记(3) -- factory-method的应用

因为单例类的特殊性,spring对于单例类的注入提供了factory-method属性。

Testing Method - 读书笔记 ( 二 )

While-box testing, Black-box testing, Grey-box testing

重新组织你的函数之一 :Extract Method(提炼函数)

你有一段代码可以被组织在一起并独立出来。 将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。 void printOwing(double amount) {      printB...

重构:Extract Method

public class Movie { public static final int CHILDRENS = 2; public static final int REGULAR ...

重构-Extract Method

Before package com.lohamce.refactor; import java.util.List; public class ExtractMethod { pri...

软件工程项目管理读书笔记

  • 2017年11月07日 20:18
  • 555KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读书笔记-重构 - Extract Method(提炼方法)
举报原因:
原因补充:

(最多只允许输入30个字)