关闭

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

标签: 重构Extract Method
267人阅读 评论(0) 收藏 举报
分类:

目标:

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

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);
}































0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2296次
    • 积分:135
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类