1. 程式人生 > >java if else巢狀程式碼重構

java if else巢狀程式碼重構

java if else 如果巢狀很深,程式碼的易讀性差和冗餘,遇到多個判斷條件,適當提前 return,可以讓程式碼結構清晰。

我們下看一個反例,程式碼如下:

public static boolean isInArea(double latitue, double longitude, double areaLatitude1, double areaLatitude2, double areaLongitude1, double areaLongitude2) {
    if (isInRange(latitue, areaLatitude1, areaLatitude2)) {
        if 
(areaLongitude1 * areaLongitude2 > 0) { if (isInRange(longitude, areaLongitude1, areaLongitude2)) { return true; } else { return false; // 冗餘 } } else { if (Math.abs(areaLongitude1) + Math.abs(areaLongitude2) < 180
) { if (isInRange(longitude, areaLongitude1, areaLongitude2)) { return true; } else { return false; // 冗餘 } } else { double left = Math.max(areaLongitude1, areaLongitude2); double
right = Math.min(areaLongitude1, areaLongitude2); if (isInRange(longitude, left, 180) || isInRange(longitude, 0, right)) { return true; } else { return false; // 冗餘 } } } } else { return false; } } public static boolean isInRange(double point, double left, double right) { if (point >= Math.min(left, right) && point <= Math.max(left, right)) { return true; } else { return false; } }
該程式碼的功能就是判斷一個GPS point是否在給定的矩形區域內,程式碼邏輯上沒有問題,大量的if else 導致程式碼不簡潔。
如下我重寫了這兩個方法,減少冗餘的判斷,提前用return 返回,減少使用else語句。
優化後的程式碼如下:
public static boolean isInArea(double latitue, double longitude, double minLatitue, double maxLatitue, double minLongitude, double maxLongitude) {
    // located in latitude range.
    if (!isInRange(latitue, minLatitue, maxLatitue)) {
        return false;
    }

    // Eastern or Western Hemisphere.
    if (minLongitude * maxLongitude > 0) {
        return isInRange(longitude, minLongitude, maxLongitude);
    }

    // One is Eastern, the other is Western, span zero.
    if (Math.abs(minLongitude) + Math.abs(maxLongitude) < 180) {
        return isInRange(longitude, minLongitude, maxLongitude);
    }

    // One is Eastern, the other is Western ,span 180.
    return isInRange(longitude, maxLongitude, 180) || isInRange(longitude, minLongitude, -180);
}

private static boolean isInRange(double point, double left, double right) {
    return point >= Math.min(left, right) && point <= Math.max(left, right);
}
優化後代碼簡潔很多,結構也清晰點。
當有大量的if else 巢狀可以考慮如下方法讓程式碼結構整潔:
1. 在if中return,減少else
2. 利用三元表達是減少判斷
3. 減少上面的判斷冗餘