优雅编程之这样简化表达式,你就“正常”了(二十三)

开心一笑

【某大公司老板巡视仓库时,发现一位工人坐在地上看漫画。
老板最恨工人在工作时间偷懒,便生气地问:“你一个月赚多少?”
工人:“一千。”
老板立刻叫旁边的职员给他一千块,并大叫:“你给我滚!”
事后,老板便问职员:“那工人是谁介绍的?”
职员说:“他不是本公司的人,是其他公司派来送货的。”
这下更气了。】

提出问题

项目开发中如何简化条件表达式???

解决问题

励志图片.png

下面来自《重构》这本书的笔记和自己的一点总结,希望可以节省大家看书时间。

Decompose Conditional(分解条件表达式)

你有一个复杂的条件表达式(if-then-else)语句。从if,then。else三个段落中分别提炼出独立函数。

例一:

public void test(){

    int sendDay = 1000;//坚持送了几天
    int flowerNum = 9;//花朵数量
    int engagementDay = 100000;//约会天数
    int callMinuteTimes = 10000;
    
    //重构前
    if(engagementDay > 100000 && callMinuteTimes > 10000 && sendDay * flowerNum >999999){
        System.out.println("恭喜你" + "--" + "可以结婚了,姑娘!!");
    }
    //重构后,例子比较简单,没什么需要解释
    if(isLove(engagementDay,callMinuteTimes,sendDay,flowerNum)){
        System.out.println("恭喜你" + "--" + "可以结婚了,姑娘!!");
    }
}

public boolean isLove(int engagementDay,int callMinuteTimes,int sendDay,int flowerNum){
    return engagementDay > 100000 && callMinuteTimes > 10000 && sendDay * flowerNum >999999;
}
Consilidate Conditional Expression(合并条件表达式)

你有一系列条件测试,都得到相同结果。将这些测试合并为一个条件表达式。并将这个条件表达式提炼成为一个独立函数。

例二:

@Test
public boolean test(){

    int sendDay = 1000;//坚持送了几天
    int flowerNum = 9;//花朵数量
    int engagementDay = 100000;//约会天数
    int callMinuteTimes = 10000;
    //重构前
    if(engagementDay > 100000) return true;
    if(callMinuteTimes > 10000) return true;
    if (sendDay * flowerNum >999999) return true;
    //重构后
    if(isLove(engagementDay,callMinuteTimes,sendDay,flowerNum)){
        return true;
    }
    return false;
}

public boolean isLove(int engagementDay,int callMinuteTimes,int sendDay,int flowerNum){
    return engagementDay > 100000 || callMinuteTimes > 10000 || sendDay * flowerNum >999999;
}

Consolidate Duplicate Conditional Fragments(合并重复的条件片段)

在条件表达式的每个分支上,有着相同的一段代码,将这段重复代码搬移到条件表达式之外。

例三:

//重构前
if(isSpecialDeal()){
    total = price * 0.95;
    send();
}else{
    total = price * 0.98;
    send();
}

//重构后
if(isSpecialDeal()){
    total = price * 0.95;
}else{
    total = price * 0.98;
}
send();
Remove Control Flag(移除控制标记)

在一系列布尔表达式中,某个变量带有控制标记的作用,以break语句或return语句取代控制标记。

例四:

重构前:
@Test
public boolean test(int loveCallNum){
//某个变量带有控制标记的作用
boolean isLove = false;

    for(int i=0;i<loveCallNum;i++){
        if(isLove){
            System.out.println("我们结婚吧!");
        }else{
            if(i == 999){
                isLove = true;
            }
        }
    }
}

重构后:

for(int i=0;i<loveCallNum;i++){
        
    if(i == 999){
        System.out.println("我们结婚吧!");
        //以break语句或return语句取代控制标记。
        break;
    }
}
Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式)

函数中的条件逻辑使人难以看清正常的执行路径。使用卫语句表现所有特殊情况。

卫语句:就是把复杂的条件表达式拆分成多个条件表达式,比如一个很复杂的表达式,嵌套了好几层的if-then-else语句,转换为多个if语句,实现它的逻辑,这多条的if语句就是卫语句

例五:

重构前:

int sendDay = 1000;//坚持送了几天
    int flowerNum = 9;//花朵数量
    int engagementDay = 100000;//约会天数
    int callMinuteTimes = 10000;
    //重构前
    if(engagementDay < 100000){
        System.out.println("待定......");
    }else{
        if(callMinuteTimes < 10000){
            System.out.println("待定......");
        }else{
            if(sendDay * flowerNum >999999){
                System.out.println("真爱......");
            }
        }
    }

重构后:下面就是卫语句

if(engagementDay < 100000) System.out.println("待定......");

if(callMinuteTimes < 10000) System.out.println("待定......");

if(sendDay * flowerNum >999999) System.out.println("真爱......");
Replace Conditional with Polymorphism(以多态取代条件表达式)

你手上有个条件表达式,他根据对象类型的不同而选择不同的行为,将这个条件表达式的每个分支放进一个子类内的覆写函数中,然后将原始函数声明为抽象函数。

Introduce Assertion(引入断言)

某一段代码需要对程序状态作出某种假设,以断言明确表现这种假设。

例六:

//获取子任务对象
PcsSubTask pcsSubTask = pcsSubTaskService.findById(subTaskId);
//在这里添加断言,确定pcsSubTask确实不为空
AssertUtils.checkResourceFound(pcsSubTask);

读书感悟

来自莫泊桑《项链》

  • 极细小的一件事可以成全你,也可以败坏你。
  • 倘若当时没有失掉那件首饰,她现在会走到什么样的境界?谁知道?谁知道?人生真是古怪,真是变化无常啊。无论是害您或者救您,只消一点点小事。
  • 浪费了?噢,不!你去上班的时候,我常常坐在窗边想,如果没有弄丢那条项链,我会是什么样子?现在,我知道答案了。

其他

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

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

推荐阅读更多精彩内容