读书笔记-重构 - 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种情...

《腾讯方法》读书笔记

  • 2017-05-18 17:09
  • 692KB
  • 下载

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

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

重新组织你的函数之一 :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...

算法导论 读书笔记

  • 2015-02-05 16:13
  • 325KB
  • 下载

读书笔记6:工厂方法模式

1、概念     定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延伸到子类。 2、背景     已经知道工厂模式,有一个父类SuperClass,以及这个父类的不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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