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

开心一笑

【唐僧4人西天取经。,一天,一位女施主缠着唐僧。唐山对孙悟空说:悟空啊,帮我鉴定一下,是人是妖。孙悟空用火眼金睛一照。回头对唐僧说:师傅,鉴定完毕,是人妖,是人妖......】

提出问题

项目中的函数如何重构???

解决问题

励志图片.png

以下是来自《重构》这本书个人的一些总结,加上自己写的一些小例子,例子有点扯,只是倡导快乐学习而已,希望大家能够喜欢:

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

读书感悟

来自梭罗《瓦尔登湖》

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

其他

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • Extract Method 提炼方法 动机 Extract Method 是最常用的重构手法之一。 函数过长或者...
    chiguozi阅读 733评论 0 0
  • 函数重构几乎都是源自于Long Methods。这导致了函数包含的信息过多,信息带来的逻辑错综复杂。 1 Extr...
    hklbird阅读 457评论 0 1
  • 如何实施重构 稍微复杂的重构过程,都是由一系列的基本重构手法组成. 《重构》一书中针对各种重构场景,给出了大量的重...
    MagicBowen阅读 3,931评论 0 3
  • 阅读《重构》的笔记献上。 重构的定义 重构是在不改变软件可观察行为的前提下改善其内部结构。 重构的节奏 以微小的步...
    陈宇明阅读 11,599评论 13 64
  • 贪恋暮色的行人徘徊 游走湖边 蛙唱起安眠,莲早早睡了 暮色迷了眼睛,便遇见 唤做小满的姑娘 头上别着火红的榴花 嘴...
    初五阅读 21,819评论 23 27