1. 程式人生 > 實用技巧 >簡單優化 if else

簡單優化 if else

簡單優化 if else

1、 阿里程式設計歸約

if語句使用“衛語句 ”減少層級巢狀。

一臉的大寫的懵逼,“衛語句”是什麼東東?趕緊找度媽。

衛語句就是把複雜的條件表示式拆分成多個條件表示式,比如一個很複雜的表示式,嵌套了好幾層的if - else語句,轉換為多個if語句,實現它的邏輯,這多條的if語句就是衛語句.

if(obj != null){
  doSomething();
}
 
//轉換成衛語句以後的程式碼如下:
if(obj == null){
   return;
}
doSomething();

衛語句的好處是條件表示式之間相互獨立,不會互擾。

2、陣列

場景:定義一個方法,獲取星期數。

private static String getWeekDay(int weekStat) {
    if (0 == weekStat) {
        return "星期天";
    }
    if (1 == weekStat) {
        return "星期一";
    }
    if (2 == weekStat){
        return "星期二";
    }
    if (3 == weekStat){
        return "星期三";
    }
    if (4 == weekStat){
        return "星期四";
    }
    if (5 == weekStat){
        return "星期五";
    }
    if (6 == weekStat){
        return "星期六";
    }
    return null;
}

// 使用該方法獲取星期六
System.out.println(getWeekDay(6));

使用陣列優化:

String[] week = {
    "星期天",
    "星期一",
    "星期二",
    "星期三",
    "星期四",
    "星期五",
    "星期六"
};

// 使用陣列獲取星期六
System.out.println(week[6])

3、策略設計模式

3.1 列舉實現

定義一個列舉類:

/**
 * 定義了一週的每一天要幹什麼
 */
enum WeekDay {
    /**星期天要作甚?*/
    Sunday("Sunday"){
        @Override
        void weekRun() {
            System.out.println(weekName + ":和朋友出去玩!");
        }
    },
    /**星期1要作甚?*/
    Monday("Monday"){
        @Override
        void weekRun() {
            System.out.println(weekName + ":在學校學習英語");
        }
    },
    /**星期2要作甚?*/
    Tuesday("Tuesday"){
        @Override
        void weekRun() {
            System.out.println(weekName + ":在學校學習java");
        }
    },
    /**星期3要作甚?*/
    Wednesday("Wednesday"){
        @Override
        void weekRun() {
            System.out.println(weekName + ":在學校學習語文");
        }
    },
    /**星期4要作甚?*/
    Thursday("Thursday"){
        @Override
        void weekRun() {
            System.out.println(weekName + ":在學校學習歷史");
        }
    },
    /**星期5要作甚?*/
    Friday("Friday"){
        @Override
        void weekRun() {
            System.out.println(weekName + "在學校玩");
        }
    },
    /**星期6要作甚?*/
    Saturday("Saturday"){
        @Override
        void weekRun() {
            System.out.println(weekName + "和朋友在家看電影");
        }
    };

    public String weekName;
    abstract void weekRun();
    WeekDay(String weekName){
        this.weekName = weekName;
    }
}

使用該列舉類:

public class Demo {
    public static void main(String[] args) {
        // 呼叫的寫法1
        WeekDay.valueOf("Sunday").weekRun();
        // 呼叫的寫法2
        WeekDay.Monday.weekRun();
    }
}

3.2 多型實現

抽象一個跑的行為

/**
 * 跑的行為抽象
 */
@FunctionalInterface
interface RunStrategy {
    void run();
}

針對該行為抽象,有幾種實現:

/**
 * 人跑的行為
 */
class PeopleRunStrategy implements RunStrategy {
    @Override
    public void run() {
        System.out.println("人用腿跑");
    }
}

/**
 * 汽車跑的行為
 */
class CarRunStrategy implements RunStrategy {

    @Override
    public void run() {
        System.out.println("汽車用輪子跑");
    }
}

/**
 * 魚跑的行為
 */
class FishRunStrategy implements RunStrategy {

    @Override
    public void run() {
        System.out.println("魚在水裡遊");
    }
}

使用對映來呼叫:

Map<String, RunStrategy> runStrategyMap = new HashMap<>(16);
runStrategyMap.put("people", new PeopleRunStrategy());
runStrategyMap.put("car", new CarRunStrategy());
runStrategyMap.put("fish", new FishRunStrategy());

// 獲取汽車的跑的實現,當沒有該實現時,呼叫人的跑的實現
RunStrategy runStrategy1 = runStrategyMap.getOrDefault("car", new PeopleRunStrategy());
// 獲取鳥的跑的實現,當沒有該實現時,呼叫人的跑的實現
RunStrategy runStrategy2 = runStrategyMap.getOrDefault("bird", new PeopleRunStrategy());
// 列印:汽車用輪子跑
runStrategy1.run();
// 列印:人用腿跑
runStrategy2.run();

4、 狀態設計模式

抽象狀態行為介面:

/**
 * Created by Feng on 2020/1/4 11:37<br>
 *     抽象狀態行為:定義不同狀態對應的方法
 *     方法的實現由其實現類完成
 */
@FunctionalInterface
interface State {
    void handle();
}

具體的狀態類:

/**
 * 具體的狀態類:空閒狀態
 */
class FreeState implements State {

    @Override
    public void handle() {
        System.out.println("閒著就寫程式碼!!");
    }
}

/**
 * 具體的狀態類:繁忙狀態
 */
class BusyState implements State {

    @Override
    public void handle() {
        System.out.println("忙了還得寫程式碼!!!");
    }
}

State 上下文:

/**
 * 在環境中維護一個抽象狀態類 State 的例項,這個例項定義當前狀態。
 * 還可以定義初始狀態
 */
class Context {
    private State state;

    /**
     * 設定狀態:呼叫handle方法
     */
    public void setState(State state){
        this.state = state;
        state.handle();
    }

    public State getState(){
        return state;
    }
}

測試:

/**
 * 客戶端:測試
 */
public class ContextClient {
    public static void main(String[] args) {
        Context context = new Context();
        context.setState(new FreeState());
        context.setState(new BusyState());
    }
}

測試結果:

  1. 閒著就寫程式碼!!
  2. 忙了還得寫程式碼!!!