优雅编程之这样重构函数(续),你就“正常”了(二十)

开心一笑

【唐僧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这个方法进行更多重构。

读书感悟

来自梭罗《瓦尔登湖》

  • 知道自己知道什么,也知道自己不知道什么,这就是真正的知识。
  • 所谓的听天由命,是一种得到证实的绝望。
  • 一个人越是有许多事情能够放得下,他越是富有。
  • 善良是唯一永远不会失败的投资。
  • 多余的财富只能换取奢靡者的生活,而心灵的必须品是无需用钱购买的。
  • 心灵与自然结合才能产生智慧,才能产生想象力。
  • 如果要避免不洁和一切罪恶,你就热忱地工作吧,即使是打扫厕所也行。
  • 再也没有哪件事比全心全力提升人生(人格)更另人鼓舞的了。
  • 很多人掉落一辈子的鱼,却不知道他们钓鱼的目的并不是为了鱼。

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!

你可能感兴趣的:(java,编程,重构,函数)