开心一笑
【唐僧4人西天取经。,一天,一位女施主缠着唐僧。唐山对孙悟空说:悟空啊,帮我鉴定一下,是人是妖。孙悟空用火眼金睛一照。回头对唐僧说:师傅,鉴定完毕,是人妖,是人妖......】
提出问题
项目中的函数如何重构???
解决问题
以下是来自《重构》这本书个人的一些总结,加上自己写的一些小例子,例子有点扯,只是倡导快乐学习而已,希望大家能够喜欢:
Introduce Explaining Variable(引入解释性变量)
你有一个复杂的表达式,将该表达式的结果放进一个临时变量,以此变量名称来解释表达式用途。
事实上该方法和Extract Method处理方式相反,作者个人喜欢用Extract Method,我的观点和作者一样的。
例一:
public String testLove(){
if((flowerNum * day > 999) && (callMinute * day) >999 && (sayLoveNum * day) >999){
return "真爱";
}else{
return "Get out";
}
}
Introduce Explaining Variable重构:
public String testLove(){
int totalFlowerNum = flowerNum * day;
int totalCallMinuteNum = callMinute * day;
int totalSayLoveNum = sayLoveNum * day;
if((totalFlowerNum> 999) && totalCallMinuteNum>999 && totalSayLoveNum >999){
return "真爱";
}else{
//有人和我说“滚”,太粗俗,我就用英文吧!
return "Get out";
}
}
Extract Method重构(作者推荐):萝卜蔬菜,个人所爱吧!
public String testLove(){
if((getTotalFlowerNum()> 999) && getTotalCallMinuteNum()>999 && getTotalSayLoveNum() >999){
return "真爱";
}else{
return "Get out";
}
}
public int getTotalFlowerNum(){
return flowerNum * day;
}
public int getTotalCallMinuteNum(){
return callMinute * day;
}
public int getTotalSayLoveNum(){
return sayLoveNum * day;
}
Split Temporary Variable(分解临时变量)
你的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果。针对每次赋值,创造一个独立,对应的临时变量。
临时变量应该只被赋值一次。如果它梦被赋值超过一次,就意味它们在函数中承担了一个以上的责任。如果临时变量承担多个责任,它就应该被替换为多个临时变量。
可以将新的临时变量声明为final来确认是否被赋值多次。
Remove Assignments to Parameters(移除对参数赋值)
代码对一个参数进行赋值。以一个临时变量取代该参数的位置
例二:
int testLove(int flowerNum,int callMinuteNum){
if(flowerNum >50) flowerNum -=2;
return flowerNum;
}
重构后:
int testLove(int flowerNum,int callMinuteNum){
int result = flowerNum;
if(result >50) result -=2;
return result;
}
再次重构:可以为参数加上关键词final,从而强制它遵守“不对参数赋值”这一惯例
int testLove(final int flowerNum,final int callMinuteNum){
int result = flowerNum;
if(result >50) result -=2;
return result;
}
但是final对于提高短函数的清晰度,并无太大帮助。通常会在较长的函数中使用它,让它帮助我检查参数是否被做了修改。
Replace Method with Method Object(以函数对象取代函数)
你有一个大型函数,其中对局部变量的使用使你无法采用Extract Method。将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的字段。然后你可以在同一个对象中将这个大型函数分解为多个小型函数。
例三:假如下面是一个很长很长的函数,我们使用重构方法
public String test(){
int sendDay = 1000;//坚持送了几天
int flowerNum = 9;//花朵数量
int engagementDay = 100000;//约会天数
int callMinuteTimes = 10000;
if(engagementDay > 100000){
return engagementDay + "--" + "可以结婚了,姑娘!!";
}else if(callMinuteTimes > 10000){
return callMinuteTimes + "--" + "可以考虑了,姑娘!!";
}else if(sendDay * flowerNum >999999){
return sendDay * flowerNum + "--" + "这是一个好小伙!!!";
}else{
return "待定";
}
}
重构:
package com.evada.de;
/**
* Created by Ay on 2016/8/27.
*/
public class LoveTest {
//源对象引用,重构过程中可能需要调用源对象的方法
private AyTest _ayTest;
private int sendDay;
private int flowerNum = 0;
private int engagementDay = 0;
private int callMinuteTimes = 0;
public LoveTest() {}
//构造方法,全部定义为final,避免被修改
public LoveTest(final AyTest ayTest,final int sendDay,final int flowerNum ,
final int engagementDay,final int callMinuteTimes){
this._ayTest = ayTest;
this.sendDay = sendDay;
this.flowerNum = flowerNum;
this.engagementDay = engagementDay;
this.callMinuteTimes = callMinuteTimes;
}
//从源对象copy过来,进行修改即可
public String testLove(){
if(engagementDay > 100000){
return engagementDay + "--" + "可以结婚了,姑娘!!";
}else if(callMinuteTimes > 10000){
return callMinuteTimes + "--" + "可以考虑了,姑娘!!";
}else if(sendDay * flowerNum >999999){
return sendDay * flowerNum + "--" + "这是一个好小伙!!!";
}else{
return "待定";
}
}
}
通过上面的修改,我们就可以利用之前学过的方法,对testLove这个方法进行更多重构。
读书感悟
来自梭罗《瓦尔登湖》
- 知道自己知道什么,也知道自己不知道什么,这就是真正的知识。
- 所谓的听天由命,是一种得到证实的绝望。
- 一个人越是有许多事情能够放得下,他越是富有。
- 善良是唯一永远不会失败的投资。
- 多余的财富只能换取奢靡者的生活,而心灵的必须品是无需用钱购买的。
- 心灵与自然结合才能产生智慧,才能产生想象力。
- 如果要避免不洁和一切罪恶,你就热忱地工作吧,即使是打扫厕所也行。
- 再也没有哪件事比全心全力提升人生(人格)更另人鼓舞的了。
- 很多人掉落一辈子的鱼,却不知道他们钓鱼的目的并不是为了鱼。
其他
如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!