優(yōu)雅編程之這樣簡化表達式产弹,你就“正常”了(二十三)

開心一笑

【某大公司老板巡視倉庫時,發(fā)現(xiàn)一位工人坐在地上看漫畫痰哨。
老板最恨工人在工作時間偷懶胶果,便生氣地問:“你一個月賺多少?”
工人:“一千斤斧≡缈伲”
老板立刻叫旁邊的職員給他一千塊,并大叫:“你給我滾撬讽!”
事后蕊连,老板便問職員:“那工人是誰介紹的?”
職員說:“他不是本公司的人游昼,是其他公司派來送貨的甘苍。”
這下更氣了烘豌≡赝ィ】

提出問題

項目開發(fā)中如何簡化條件表達式?廊佩?囚聚?

解決問題

勵志圖片.png

下面來自《重構(gòu)》這本書的筆記和自己的一點總結(jié),希望可以節(jié)省大家看書時間标锄。

Decompose Conditional(分解條件表達式)

你有一個復雜的條件表達式(if-then-else)語句顽铸。從if,then鸯绿。else三個段落中分別提煉出獨立函數(shù)跋破。

例一:

public void test(){

    int sendDay = 1000;//堅持送了幾天
    int flowerNum = 9;//花朵數(shù)量
    int engagementDay = 100000;//約會天數(shù)
    int callMinuteTimes = 10000;
    
    //重構(gòu)前
    if(engagementDay > 100000 && callMinuteTimes > 10000 && sendDay * flowerNum >999999){
        System.out.println("恭喜你" + "--" + "可以結(jié)婚了,姑娘F亢毒返!");
    }
    //重構(gòu)后,例子比較簡單舷手,沒什么需要解釋
    if(isLove(engagementDay,callMinuteTimes,sendDay,flowerNum)){
        System.out.println("恭喜你" + "--" + "可以結(jié)婚了拧簸,姑娘!男窟!");
    }
}

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

你有一系列條件測試盆赤,都得到相同結(jié)果。將這些測試合并為一個條件表達式歉眷。并將這個條件表達式提煉成為一個獨立函數(shù)牺六。

例二:

@Test
public boolean test(){

    int sendDay = 1000;//堅持送了幾天
    int flowerNum = 9;//花朵數(shù)量
    int engagementDay = 100000;//約會天數(shù)
    int callMinuteTimes = 10000;
    //重構(gòu)前
    if(engagementDay > 100000) return true;
    if(callMinuteTimes > 10000) return true;
    if (sendDay * flowerNum >999999) return true;
    //重構(gòu)后
    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(合并重復的條件片段)

在條件表達式的每個分支上,有著相同的一段代碼汗捡,將這段重復代碼搬移到條件表達式之外淑际。

例三:

//重構(gòu)前
if(isSpecialDeal()){
    total = price * 0.95;
    send();
}else{
    total = price * 0.98;
    send();
}

//重構(gòu)后
if(isSpecialDeal()){
    total = price * 0.95;
}else{
    total = price * 0.98;
}
send();
Remove Control Flag(移除控制標記)

在一系列布爾表達式中,某個變量帶有控制標記的作用,以break語句或return語句取代控制標記春缕。

例四:

重構(gòu)前:
@Test
public boolean test(int loveCallNum){
//某個變量帶有控制標記的作用
boolean isLove = false;

    for(int i=0;i<loveCallNum;i++){
        if(isLove){
            System.out.println("我們結(jié)婚吧盗胀!");
        }else{
            if(i == 999){
                isLove = true;
            }
        }
    }
}

重構(gòu)后:

for(int i=0;i<loveCallNum;i++){
        
    if(i == 999){
        System.out.println("我們結(jié)婚吧!");
        //以break語句或return語句取代控制標記锄贼。
        break;
    }
}
Replace Nested Conditional with Guard Clauses(以衛(wèi)語句取代嵌套條件表達式)

函數(shù)中的條件邏輯使人難以看清正常的執(zhí)行路徑票灰。使用衛(wèi)語句表現(xiàn)所有特殊情況。

衛(wèi)語句:就是把復雜的條件表達式拆分成多個條件表達式宅荤,比如一個很復雜的表達式屑迂,嵌套了好幾層的if-then-else語句,轉(zhuǎn)換為多個if語句膘侮,實現(xiàn)它的邏輯屈糊,這多條的if語句就是衛(wèi)語句

例五:

重構(gòu)前:

int sendDay = 1000;//堅持送了幾天
    int flowerNum = 9;//花朵數(shù)量
    int engagementDay = 100000;//約會天數(shù)
    int callMinuteTimes = 10000;
    //重構(gòu)前
    if(engagementDay < 100000){
        System.out.println("待定......");
    }else{
        if(callMinuteTimes < 10000){
            System.out.println("待定......");
        }else{
            if(sendDay * flowerNum >999999){
                System.out.println("真愛......");
            }
        }
    }

重構(gòu)后:下面就是衛(wèi)語句

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

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

if(sendDay * flowerNum >999999) System.out.println("真愛......");
Replace Conditional with Polymorphism(以多態(tài)取代條件表達式)

你手上有個條件表達式,他根據(jù)對象類型的不同而選擇不同的行為琼了,將這個條件表達式的每個分支放進一個子類內(nèi)的覆寫函數(shù)中逻锐,然后將原始函數(shù)聲明為抽象函數(shù)。

Introduce Assertion(引入斷言)

某一段代碼需要對程序狀態(tài)作出某種假設(shè)雕薪,以斷言明確表現(xiàn)這種假設(shè)昧诱。

例六:

//獲取子任務(wù)對象
PcsSubTask pcsSubTask = pcsSubTaskService.findById(subTaskId);
//在這里添加斷言,確定pcsSubTask確實不為空
AssertUtils.checkResourceFound(pcsSubTask);

讀書感悟

來自莫泊伤《項鏈》

  • 極細小的一件事可以成全你盏档,也可以敗壞你。
  • 倘若當時沒有失掉那件首飾燥爷,她現(xiàn)在會走到什么樣的境界蜈亩?誰知道?誰知道前翎?人生真是古怪稚配,真是變化無常啊。無論是害您或者救您港华,只消一點點小事道川。
  • 浪費了?噢立宜,不冒萄!你去上班的時候,我常常坐在窗邊想橙数,如果沒有弄丟那條項鏈尊流,我會是什么樣子?現(xiàn)在灯帮,我知道答案了奠旺。

其他

如果有帶給你一絲絲小快樂蜘澜,就讓快樂繼續(xù)傳遞下去,歡迎轉(zhuǎn)載响疚,點贊,頂瞪醋,歡迎留下寶貴的意見忿晕,多謝支持!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末银受,一起剝皮案震驚了整個濱河市践盼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宾巍,老刑警劉巖咕幻,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顶霞,居然都是意外死亡肄程,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門选浑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓝厌,“玉大人,你說我怎么就攤上這事古徒⊥靥幔” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵隧膘,是天一觀的道長代态。 經(jīng)常有香客問我,道長疹吃,這世上最難降的妖魔是什么蹦疑? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮互墓,結(jié)果婚禮上必尼,老公的妹妹穿的比我還像新娘。我一直安慰自己篡撵,他們只是感情好判莉,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著育谬,像睡著了一般券盅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膛檀,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天锰镀,我揣著相機與錄音娘侍,去河邊找鬼。 笑死泳炉,一個胖子當著我的面吹牛憾筏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播花鹅,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼氧腰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刨肃?” 一聲冷哼從身側(cè)響起古拴,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎真友,沒想到半個月后黄痪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡盔然,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年桅打,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轻纪。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡油额,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刻帚,到底是詐尸還是另有隱情潦嘶,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布崇众,位于F島的核電站掂僵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏顷歌。R本人自食惡果不足惜锰蓬,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眯漩。 院中可真熱鬧芹扭,春花似錦、人聲如沸赦抖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽队萤。三九已至轮锥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間要尔,已是汗流浹背舍杜。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工新娜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人既绩。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓概龄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親熬词。 傳聞我的和親對象是個殘疾皇子旁钧,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容