成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何簡化條件表達(dá)式

這篇文章主要介紹“如何簡化條件表達(dá)式”,在日常操作中,相信很多人在如何簡化條件表達(dá)式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何簡化條件表達(dá)式”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)公司公司2013年成立,先為灤州等服務(wù)建站,灤州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為灤州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

前言

與面向過程編程相比,面向?qū)ο缶幊痰臈l件表達(dá)式相對來說已經(jīng)比少了,因為很多的條件行為都可以被多態(tài)的機(jī)制處理掉;但是有時候我們還是會遇到一些小伙伴寫出來的條件表達(dá)式和面向過程編程沒什么差別,比如我遇到過這段代碼:

如何簡化條件表達(dá)式

整段代碼有三層,每一層還有if-else,本身的這段代碼的邏輯就夠難以理解了,更加惡心的是這個方法的調(diào)用方以及調(diào)用的其他方法,同樣也是這樣的if-else嵌套幾層; 加之這段代碼還有一個很大的問題是傳入的參數(shù)對象,在內(nèi)部以及調(diào)用的其他方法中被修改多次修改,這樣就更難懂了;靠普通人的單核CPU想看懂太難了,維護(hù)這段代碼我感覺身體被掏空

如何簡化條件表達(dá)式

有時候我們可能會遇到比較復(fù)雜的條件邏輯,需要我們想辦法把分成若干個小塊,讓分支邏輯和操作細(xì)節(jié)分離;看一個程序員的碼德如何,先看他的條件表達(dá)式是否夠簡潔易懂;今天我們來分享一下簡化條件表達(dá)式的常用方法,修煉自己的碼德。

分解條件表達(dá)式

復(fù)雜的條件邏輯是最常導(dǎo)致復(fù)雜度上升的地方之一,另外如果分支內(nèi)部邏輯也很多,最終我們會得到一個很大的函數(shù),一個長的方法可讀性本身就會下降,所以我們需要把大的方法才分的多個的方法,為每個方法取一個容易清楚表達(dá)實現(xiàn)內(nèi)部邏輯的方法名,這樣可讀性就會上大大提高。

舉例:

if (date.before (SUMMER_START) || date.after(SUMMER_END)) {
    charge = quantity * _winterRate + _winterServiceCharge;
} else {
    charge = quantity * _summerRate
}

這種代碼很多人可能都覺得沒必要去提取方法,但是如果我們想要看懂這段代碼,還是必須的去想想才知道在做什么;接下來我們修改一下

if (notSummer(date)) {
    charge = winterCharge(quantity);
} else {
    charge = summerCharge(quantity);
}

private boolean notSummer(Date date){
    date.before (SUMMER_START) || date.after(SUMMER_END)
}

private double summerCharge(int quantity) {
    return quantity * _summerRate;
}

private double winterCharge(int quantity) {
    return quantity * _winterRate + _winterServiceCharge;
}

這樣修改之后是不是很清楚,好的代碼本身不需要寫注釋(代碼具有自說明性),更不需要在方法內(nèi)部寫任何注釋,有時候我們會看到有同學(xué)會在方法內(nèi)部隔幾行就會寫一點注釋,這說明本身代碼的自說明性不夠好,可以通過剛才這個例子的方式提高代碼的可讀性


合并條件表達(dá)式

當(dāng)遇到一段代碼多個if條件判斷,但是條件內(nèi)部的邏輯缺類似,我們可以把條件合并在一起,然后抽取方法。

舉例1:

double disabilityAmount () {
    if(_seniortiy <2 ) 
        return 0;
    if(_monthsDisabled > 12)
        return 0;
    if(_isPartTime)
        return 0;
    // 省略...
}

這里的條件返回的結(jié)果都是一樣的,那么我們先把條件合并起來

double disabilityAmount () {
    if(_seniortiy <2 || _monthsDisabled > 12 || _isPartTime) {
        return 0;
    }
    // 省略...
}

接下來我們再來把判斷條件判斷條件抽取成方法提高可讀性

double disabilityAmount () {
    if(isNotEligibleForDisableility()) {
        return 0;
    }
    // 省略...
}

boolean isNotEligibleForDisableility() {
    return _seniortiy <2 || _monthsDisabled > 12 || _isPartTime;
}

舉例2:

if(onVacation()) {
    if(lengthOfService() > 10) {
        return 2;
    }
}
return 1;

合并之后的代碼

if(onVacation() && lengthOfService() > 10){
    return 2
}
return 1;

接著我們可以使用三元操作符更加簡化,修改后的代碼:

return onVacation() && lengthOfService() > 10 ? 2 : 1;

通過這兩個例子我們可以看出,先把條件邏輯與分支邏輯抽離成不同的方法分離開,然后我們會發(fā)現(xiàn)提高代碼的可讀性是如此的簡單,得心應(yīng)手;所以抽離好的方法是關(guān)鍵;我覺得此處應(yīng)該有掌聲

如何簡化條件表達(dá)式


合并重復(fù)的條件片段

我們先來看一個例子,10歲以下的小朋友票價打5折

if(ageLt10(age)) {
    price = price * 0.5;
    doSomething();
} else {
    price = price * 1;
    doSomething();
}

我們發(fā)現(xiàn)不同的分支都執(zhí)行了相同的末段代碼邏輯,這時候我們可以把這段代碼提取到條件判斷之外,這里舉得例子較為簡單,通常工作中遇到的可能不是這樣一個簡單的方法,而是很多行復(fù)雜的邏輯條件,我們可以先把這個代碼提取成一個方法,然后把這個方法的調(diào)用放在條件判斷之前或之后

修改之后的代碼

if(ageLt10(age)) {
    price = price * 0.5;
} else {
    price = price * 1;
}
doSomething();

當(dāng)我們遇到try-catch中有相同的邏輯代碼,我們也可以使用這種方式處理


衛(wèi)語句取代嵌套條件表達(dá)式

方法中一旦出現(xiàn)很深的嵌套邏輯讓人很難看懂執(zhí)行的主線。當(dāng)使用了if-else表示兩個分支都是同等的重要,都是主線流程;向下圖表達(dá)的一樣, 如何簡化條件表達(dá)式

但是大多數(shù)時候我們會遇到只有一條主線流程,其他的都是個別的異常情況,在這種情況下使用if-else就不太合適,應(yīng)該用衛(wèi)語句取代嵌套表達(dá)式。 如何簡化條件表達(dá)式

舉例1:

在薪酬系統(tǒng)中,以特殊的規(guī)則處理死亡員工,駐外員工,退休員工的薪資,這些情況都是很少出現(xiàn),不屬于正常邏輯;

double getPayAmount() {
    double result;
    if(isDead){
        result = deadAmount();
    } else {
        if(isSeparated) {
            result = separatedAmount();
        } else {
            if(isRetired) {
                result = retiredAmount();
            } else {
                result = normalPayAmount();
            }
        }
    }
    return result;
}

在這段代碼中,我們完全看不出正常流程是什么,這些偶爾發(fā)生的情況把正常流程給掩蓋了,一旦發(fā)生了偶然情況,就應(yīng)該直接返回,引導(dǎo)代碼的維護(hù)者去看一個沒用意義的else只會妨礙理解;讓我們用return來改造一下

double getPayAmount() {
    if(isDead){
        return deadAmount();
    }
    if(isSeparated) {
        return separatedAmount():
    }
    if(isRetired) {
        return retiredAmount();
    }
    return normalPayAmount();
}
多態(tài)取代條件表達(dá)式

有時候我們會遇到if-else-if或者switch-case這種結(jié)構(gòu),這樣的代碼不僅不夠整潔,遇到復(fù)雜邏輯也同樣難以理解。這種情況我們可以利用面向?qū)ο蟮亩鄳B(tài)來改造。

舉例: 假如你正在開發(fā)一款游戲,需要寫一個獲取箭塔(Bartizan)、弓箭手(Archer)、坦克(Tank)攻擊力的方法;經(jīng)過兩個小時的努力終于完成了這個功能;開發(fā)完成后的代碼如下:

int attackPower(Attacker attacker) {
    switch (attacker.getType()) {
        case "Bartizan":
            return 100;
        case "Archer":
            return 50;
        case "Tank":
            return 800;
    }
    throw new RuntimeException("can not support the method");
}

經(jīng)過自測后沒有任何問題,此時你的心情很爽

如何簡化條件表達(dá)式

當(dāng)你提交代碼交由領(lǐng)導(dǎo)review的時候,領(lǐng)導(dǎo)(心里想著這點東西搞兩個小時,上班摸魚太明顯了吧)直接回復(fù)代碼實現(xiàn)不夠優(yōu)雅,重寫

1. 枚舉多態(tài)

你看到這個回復(fù)雖然心里很不爽,但是你也沒辦法,畢竟還是要在這里混飯吃的;嘴上還是的回答OK

你思考了一會想到了使用枚舉的多態(tài)來實現(xiàn)不就行了,說干就干,于是你寫了下一個版本

int attackPower(Attacker attacker) {
   return AttackerType.valueOf(attacker.getType()).getAttackPower();
}

enum AttackerType {
    Bartizan("箭塔") {
        @Override
        public int getAttackPower() {
            return 100;
        }
    },
    Archer("弓箭手") {
        @Override
        public int getAttackPower() {
            return 50;
        }
    },
    Tank("坦克") {
        @Override
        public int getAttackPower() {
            return 800;
        }
    };

    private String label;

    Attacker(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }

    public int getAttackPower() {
        throw new RuntimeException("Can not support the method");
    }
}

這次再提交領(lǐng)導(dǎo)review,順利通過了,你心想總于get到了領(lǐng)導(dǎo)的點了

2. 類多態(tài)

沒想到你沒高興幾天,又接到個新的需求,這個獲取攻擊力的方法需要修改,根據(jù)攻擊者的等級不同而攻擊力也不同;你考慮到上次的版本攻擊力是固定的值,使用枚舉還比較合適,而這次的修改要根據(jù)攻擊者的本身等級來計算攻擊了,如果再使用枚舉估計是不合適的;同時你也想著上次簡單實現(xiàn)被領(lǐng)導(dǎo)懟了,這次如果還是在上次的枚舉版本上來實現(xiàn),估計也不會有好結(jié)果;最后你決定使用類的多態(tài)來完成

int attackPower(Attacker attacker) {
    return attacker.getAttackPower();
}

interface Attacker {
    default int getAttackPower() {
        throw new RuntimeException("Can not support the method");
    }
}

class Bartizan implements Attacker {
    public int getAttackPower() {
        return 100 * getLevel();
    }
}

class Archer implements Attacker {
    public int getAttackPower() {
        return 50 * getLevel();
    }
}

class Tank implements Attacker {
    public int getAttackPower() {
        return 800 * getLevel();
    }
}

完成之后提交給領(lǐng)導(dǎo)review,領(lǐng)導(dǎo)笑了笑通過了代碼評審;

3. 策略模式

你本以為這樣就結(jié)束了,結(jié)果計劃趕不上變化,游戲上線后,效果不是太好,你又接到了一個需求變更,攻擊力的計算不能這么粗暴,我們需要后臺配置規(guī)則,讓部分參加活動玩家的攻擊力根據(jù)規(guī)則提升。

你很生氣,心里想著:沒聽說過殺死程序員不需要用槍嗎,改三次需求就可以了,MD這是想我死嗎。

如何簡化條件表達(dá)式

生氣歸生氣,但是不敢表露出來,誰讓你是領(lǐng)導(dǎo)呢,那就開搞吧

考慮到本次的邏輯加入了規(guī)則,規(guī)則本身可以設(shè)計的簡單,也可以設(shè)計的很復(fù)雜,如果后期規(guī)則變得更加復(fù)雜,那么整個攻擊對象類中會顯得特別的臃腫,擴(kuò)展性也不好,所以你這次不再使用類的多態(tài)來實現(xiàn),考慮使用策略模式,完成后代碼如下:

//定義計算類的接口
interface AttackPowerCalculator {
    boolean support(Attacker attacker);

    int calculate(Attacker attacker);
}

//箭塔攻擊力計算類
class BartizanAttackPowerCalculator implements AttackPowerCalculator {

    @Override
    public boolean support(Attacker attacker) {
        return "Bartizan".equals(attacker.getType());
    }

    @Override
    public int calculate(Attacker attacker) {
        //根據(jù)規(guī)則計算攻擊力
        return doCalculate(getRule());
    }
}

//弓箭手攻擊力計算類
class ArcherAttackPowerCalculator implements AttackPowerCalculator {

    @Override
    public boolean support(Attacker attacker) {
        return "Archer".equals(attacker.getType());
    }

    @Override
    public int calculate(Attacker attacker) {
        //根據(jù)規(guī)則計算攻擊力
        return doCalculate(getRule());
    }
}

//坦克攻擊力計算類
class TankAttackPowerCalculator implements AttackPowerCalculator {

    @Override
    public boolean support(Attacker attacker) {
        return "Tank".equals(attacker.getType());
    }

    @Override
    public int calculate(Attacker attacker) {
        //根據(jù)規(guī)則計算攻擊力
        return doCalculate(getRule());
    }
}

//聚合所有計算類
class AttackPowerCalculatorComposite implements AttackPowerCalculator {
    List<AttackPowerCalculator> calculators = new ArrayList<>();

    public AttackPowerCalculatorComposite() {
        this.calculators.add(new TankAttackPowerCalculator());
        this.calculators.add(new ArcherAttackPowerCalculator());
        this.calculators.add(new BartizanAttackPowerCalculator());
    }

    @Override
    public boolean support(Attacker attacker) {
        return true;
    }

    @Override
    public int calculate(Attacker attacker) {
        for (AttackPowerCalculator calculator : calculators) {
            if (calculator.support(attacker)) {
                calculator.calculate(attacker);
            }
        }
        throw new RuntimeException("Can not support the method"); 
    }
}

//入口處通過調(diào)用聚合類來完成計算
int attackPower(Attacker attacker) {
    AttackPowerCalculator calculator = new AttackPowerCalculatorComposite();
    return calculator.calculate(attacker);
}

你再次提交代碼給領(lǐng)導(dǎo)review,領(lǐng)導(dǎo)看了很滿意,表揚你說:小伙子,不錯,進(jìn)步很快嘛,給你點贊哦;你回答:感謝領(lǐng)導(dǎo)認(rèn)可(心里想那是當(dāng)然,畢竟我已經(jīng)摸清了你的點在哪里了)

覺得本次你的這個功能完成的還比較滿意的,請點贊關(guān)注評論走起哦

如何簡化條件表達(dá)式

引入斷言

最后一個簡化條件表達(dá)式的操作是引入斷言,這部分比較簡單,并且Spring框架本身也提供了斷言的工具類,比如下面這段代碼:

public void getProjectLimit(String project){
    if(project == null){
        throw new RuntimeException("project can not null");
    }
    doSomething();
}

加入Spring的斷言后的代碼

public void getProjectLimit(String project){
    Assert.notNull(project,"project can not null");
    doSomething();
}

到此,關(guān)于“如何簡化條件表達(dá)式”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

網(wǎng)站欄目:如何簡化條件表達(dá)式
當(dāng)前網(wǎng)址:http://jinyejixie.com/article22/iejhjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、網(wǎng)站收錄、電子商務(wù)App開發(fā)、關(guān)鍵詞優(yōu)化移動網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
西青区| 枣强县| 宜都市| 依兰县| 吉木乃县| 观塘区| 库尔勒市| 黄骅市| 新竹市| 永安市| 岢岚县| 观塘区| 泌阳县| 徐水县| 丘北县| 南丰县| 无极县| 巴青县| 正蓝旗| 安乡县| 临夏县| 济南市| 上思县| 文安县| 卓资县| 攀枝花市| 海阳市| 恩施市| 木里| 香港| 怀柔区| 邳州市| 河津市| 章丘市| 合肥市| 溧水县| 临城县| 涿州市| 宜君县| 郁南县| 肥城市|