網頁

2019/11/30

Java 使用Guard clause (Early return)防衛語句

今天學到Guard clause(防衛語句)的程式寫法概念。

在這之前我都沒注意到Guard clause寫法,直到今天code review才知道。

Guard clause又稱Early return,簡單說就是在執行正向的邏輯前先對參數內容進行檢驗並預先返回結果。

例如下面兩個sendEmail()都是發送email,上面的沒有使用Guard clause,下面的使用Guard clause。

public void sendEmail(String email) {
    if (!StringUtils.isEmpty(email) && isEmailFormat(email)) {
        // 發送email的邏輯
    }
}

/** Guard Clause 防衛語句寫法 */
public void sendEmail(String email) {
    if (StringUtils.isEmpty(email) || !isEmailFormat(email)) {
        return;
    }
    
    // 發送email的邏輯
    
}

Guard clause的好處是提高程式的可讀性,透過預先排除不符規格的內容可減少巢狀if else的發生或過長的if else區塊。

Guard clause除了預先檢驗輸入的參數,也可應用在預先返回各種可能的結果。讓可讀性提高。

例如下面計算費用calculateFee()中要依顧客類型計算不同的費用,使用Guard clause讓可讀性比較好,除錯時也比較容易。

private int calculateFee(Customer customer) {
    int result = 0;

    if (isVip(customer)) {
        result = calculateVipFee(customer);
    } else if (isVvip(customer)) {
        result = calculateVvipFee(customer);
    } else if (isVvvip(customer)){
        result = calculateVvvipFee(customer);
    } else {
        result = calculateNormalFee(customer)
    }
    
    return result;
}

/** Guard Clause 防衛語句寫法 */
private int calculateFee(Customer customer) {
    if (isVip(customer)) {
        return calculateVipFee(customer);
    }
    if (isVvip(customer)) {
        return calculateVvipFee(customer);
    }
    if (isVvvip(customer)){
        return calculateVvvipFee(customer);
    }
    
    return calculateNormalFee(customer);
    
}


沒有留言:

張貼留言